Я читал исходный код zmq и наткнулся на следующий typedef
typedef struct {unsigned char _ [32];} zmq_msg_t;
Я не понимаю, что означает подчеркивание в этом определении. Может кто-то, пожалуйста, пролить свет?
Я читал исходный код zmq и наткнулся на следующий typedef
typedef struct {unsigned char _ [32];} zmq_msg_t;
Я не понимаю, что означает подчеркивание в этом определении. Может кто-то, пожалуйста, пролить свет?
Подчеркивание (_
) является допустимым идентификатором, в данном случае - именем члена структуры. Это не имеет никакого особого значения, как такового.
Цитата C11
, глава §6.4.2.1, Идентификаторы
Идентификатор представляет собой последовательность недигитных символов (включая подчеркивание
_
, строчные и прописные латинские буквы и другие символы) и цифры, которые обозначают один или несколько объектов [....]
AFAIR, это верно в случае С++, также см. главу 2.11, С++ 14.
Это ничего не значит, это просто имя члена структуры.
Это не самое коммуникативное имя, но оно, вероятно, было немного "секретным".
Идентификатор в основном должен соответствовать [A-Za-z_][A-Za-z_0-9]*
, и это делает.
В нескольких языках существует соглашение использовать идентификатор _
для переменных "не заботьтесь", которые не должны упоминаться. Например, вы можете написать в Схеме /Lisp
(let* ((x ...)
(_ ...<some side effect depending on x>)
(y ...<something making use of the side effect result>))
...)
В этом случае нет проблем с областью определения, так как вы можете переназначить _
столько раз, сколько хотите. В C/С++ это соглашение не все так работоспособно, так как чаще всего конфликтует несколько вариантов использования _
. Нет необходимости игнорировать параметры, так как вы можете просто опустить их вообще:
int fun(int a, int, int b) { return a + b; }
Однако, поскольку единственная размерная замена в структуре (для которой она используется здесь), вы не можете опустить идентификатор, и вам понадобится только один идентификатор для пространства имен. Таким образом, в этом случае это соглашение работает. Но как идиоматический шаблон, он используется на других языках намного больше.
Из cppreference, если у меня нет копии Стандарта:
Идентификатор представляет собой произвольно длинную последовательность цифр, подчеркивание, строчные и прописные латинские буквы и большинство символов Unicode
Таким образом, _
- это имя переменной. См. Также
Каковы правила использования подчеркивания в идентификаторе С++?
для справки об использовании символов подчеркивания в идентификаторах
Одним словом? Ничего. _ является символом как любой другой и может использоваться для обозначения переменной...
Однако большинство программистов используют _ для замены пробелов в именах переменных... так что вы можете сделать что-то вроде этого:
int my_darling_little_beloved_variable;