Является ли (одно подчеркивание) допустимым именем переменной C++?

С gcc 4.7.2 это компилируется просто отлично для меня:

int main()
{
  int _ = 1;
  return 0;
}

могу ли я ожидать, что это будет компилироваться в целом? Я читал ответы о подчеркиваниях как префиксах. Но что, если подчеркивание не начинаются?

5 ответов


имя (идентификатор) состоит из последовательности букв и цифр. Этот первым символом должна быть буква. Символ подчеркивания"_", _, - это рассматривал письмо.

из языка программирования C++, 4-е издание.


по словам Страуструпа (3-е издание, раздел 4.9.3), идентификатор состоит из последовательности букв и цифр. Первый символ должен быть буквой. Символ подчеркивания считается буквой.

Итак, да, он должен быть портативным.


Да _ является допустимым идентификатором, так как он соответствует требованиям синтаксис. В основном идентификатор состоит из символа подчеркивания или буквы, за которым следует ноль или более других символов, которые могут быть символами подчеркивания, буквами или цифрами. (Начиная с C++ 2011 идентификаторы также могут содержать универсальные имена символов и другие символы, определенные реализацией, но это не относится к вашему вопросу.)

но это, вероятно, не тот, который вы должны использовать в своем собственном коде, если вы не очень осторожный.

As ответ говорит, цитируя стандарт 2003 C++:

каждое имя, начинающееся с подчеркивания зарезервированы для реализация для использования в качестве имени в глобальном пространстве имен.

код _ переменная не находится в глобальном пространстве имен, поэтому в этом случае вы в безопасности, но это хорошая идея, чтобы избежать определения любой идентификаторы, начинающиеся с подчеркивания.

кроме того, я считаю GNU gettext (который обеспечивает поддержку локализованных сообщений) использует имя _ для своих целей. (Возможно, это была плохая идея для GNU gettext сделать это, но это был удобный выбор.)


да. один _ будет приниматься как переменная или любое имя идентификатора / пространства имен! Е. Г. Гугл макет использует это.


Да, это допустимый префикс. Бег!--2-->

#include <iostream>

using namespace std;

int main()
{
char* _ = "Hello World";
cout << _ << endl; 
return 0;
}

распечатывает "Hello World", как и ожидалось. Это не очень полезное имя varible, но оно действительно