web-dev-qa-db-ja.com

typedef構造でアンダースコアはどういう意味ですか?

Zmqのソースコードを読んでいて、次のtypedefに出くわしました。

typedef struct {unsigned char _ [32];} zmq_msg_t;

この定義でアンダースコアが何を意味するのかわかりません。誰かが光を当てるのを手伝ってくれませんか?

20
Jerry Feng

アンダースコア(_)は有効な識別子であり、この場合は構造体のメンバーの名前です。 specialという意味はありません。

C11の引用、§6.4.2.1章、識別子

識別子は、数字以外の文字(アンダースコア_、小文字と大文字のラテン文字、およびその他の文字を含む)と数字のシーケンスであり、1つ以上のエンティティを指定します[....]

AFAIR、これはC++の場合にも当てはまります。また、2.11章C++ 14を参照してください。

32
Sourav Ghosh

それは何の意味もありません、それは単に構造体メンバーの名前です。

これは最もわかりやすい名前ではありませんが、おそらく少し「秘密」として選択されています。

識別子は基本的に[A-Za-z_][A-Za-z_0-9]*と一致する必要があり、これは一致します。

19
unwind

いくつかの言語では、参照されることは想定されていない「ドントケア」変数に識別子_を使用する規則があります。たとえば、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つの識別子のみが必要になります。したがって、この場合、この規則はうまくいきます。しかし、慣用的なパターンとして、他の言語ではさらに多く使用されています。

12
user7576024

Cppreferenceから、私がStandardのコピーを持っていないため:

識別子は、任意の長さの数字、アンダースコア、小文字と大文字のラテン文字、およびほとんどのUnicode文字です。

したがって、_は変数名です。も参照してください

C++識別子でアンダースコアを使用する際のルールは何ですか?

識別子でのアンダースコアの使用に関する参照用

3
iksemyonov

一言で?何もありません。 _は他の文字と同じで、変数に名前を付けるために使用できます。

ただし、ほとんどのプログラマーは_を使用して変数名のスペースを置き換えます...したがって、次のようなことができます。

int my_darling_little_beloved_variable;

1
Luiz Menezes