С gcc 4.7.2 это прекрасно компилируется:
int main()
{
int _ = 1;
return 0;
}
Могу ли я ожидать, что это скомпилировать в целом? Я прочитал ответы о подчеркиваниях в качестве префиксов. Но что, если подчеркивание не содержит префиксов?
Имя (идентификатор) состоит из последовательности букв и цифр.
Первый символ должен быть буквой. Символ подчеркивания, _, является
считать письмо.
Из языка программирования C ++, 4-е издание.
Согласно Страуструпу (3-е издание, раздел 4.9.3), идентификатор состоит из последовательности букв и цифр. Первый символ должен быть буквой. Символ подчеркивания считается буквой.
Так что да, он должен быть портативным.
Да, _
является допустимым идентификатором, так как он соответствует требованиям синтаксиса. По сути, идентификатор состоит из символа подчеркивания или буквы, за которым следует ноль или более других символов, которые могут быть символами подчеркивания, буквами или цифрами. (Начиная с C ++ 2011, идентификаторы могут также содержать универсальные имена символов и другие символы, определяемые реализацией, но это не относится к вашему вопросу.)
Но это, вероятно, не тот, который вы должны использовать в своем собственном коде, если вы не очень осторожны.
Как этот ответ говорит, цитируя стандарт C ++ 2003:
Каждое имя, начинающееся с подчеркивания, зарезервировано для
реализация для использования в качестве имени в глобальном пространстве имен.
Ваш _
переменная не находится в глобальном пространстве имен, так что в этом случае вы в безопасности, но это хорошая идея, чтобы избежать определения любой идентификаторы, начинающиеся с подчеркивания.
Кроме того, я считаю, что GNU gettext (который обеспечивает поддержку локализованных сообщений) использует имя _
для своих целей. (Возможно, это было плохой идеей для GNU gettext, но это был удобный выбор.)
Да. один _
будет принят в качестве переменной или любого идентификатора / имени пространства имен! Например. гугл макет использует это.
Да, это действительный префикс.
Бег
#include <iostream>
using namespace std;
int main()
{
char* _ = "Hello World";
cout << _ << endl;
return 0;
}
распечатывает «Hello World», как и ожидалось. Это не очень полезное переменное имя, но оно действительно