Zmqのソースコードを読んでいて、次のtypedef
に出くわしました。
typedef struct {unsigned char _ [32];} zmq_msg_t;
この定義でアンダースコアが何を意味するのかわかりません。誰かが光を当てるのを手伝ってくれませんか?
アンダースコア(_
)は有効な識別子であり、この場合は構造体のメンバーの名前です。 specialという意味はありません。
C11
の引用、§6.4.2.1章、識別子
識別子は、数字以外の文字(アンダースコア
_
、小文字と大文字のラテン文字、およびその他の文字を含む)と数字のシーケンスであり、1つ以上のエンティティを指定します[....]
AFAIR、これはC++の場合にも当てはまります。また、2.11章C++ 14を参照してください。
それは何の意味もありません、それは単に構造体メンバーの名前です。
これは最もわかりやすい名前ではありませんが、おそらく少し「秘密」として選択されています。
識別子は基本的に[A-Za-z_][A-Za-z_0-9]*
と一致する必要があり、これは一致します。
いくつかの言語では、参照されることは想定されていない「ドントケア」変数に識別子_
を使用する規則があります。たとえば、Scheme/LISPで書くことができます
(let* ((x ...)
(_ ...<some side effect depending on x>)
(y ...<something making use of the side effect's result>))
...)
この場合、_
を何度でも再割り当てできるため、スコープに問題はありません。 C/C++では、_
のいくつかの使用法が競合することが多いため、この規則はそれほど機能しません。パラメータを完全に省略できるため、無視されたパラメータは必要ありません。
int fun(int a, int, int b) { return a + b; }
ただし、構造体(ここで使用されている)の唯一のサイズの代替として、識別子を省略することはできず、名前空間ごとに1つの識別子のみが必要になります。したがって、この場合、この規則はうまくいきます。しかし、慣用的なパターンとして、他の言語ではさらに多く使用されています。
Cppreferenceから、私がStandardのコピーを持っていないため:
識別子は、任意の長さの数字、アンダースコア、小文字と大文字のラテン文字、およびほとんどのUnicode文字です。
したがって、_
は変数名です。も参照してください
C++識別子でアンダースコアを使用する際のルールは何ですか?
識別子でのアンダースコアの使用に関する参照用
一言で?何もありません。 _は他の文字と同じで、変数に名前を付けるために使用できます。
ただし、ほとんどのプログラマーは_を使用して変数名のスペースを置き換えます...したがって、次のようなことができます。int my_darling_little_beloved_variable;