Вы можете начинать имя класса с цифры?
на C++, можно ли начать имя класса с цифры? Например,
template <class T> class 2DArray {
public:
// 1D ARRAY CLASS
class 1DArray {
public:
1DArray() { Create(); }
1DArray(iterator arr) : array1d_(arr) { }
explicit 1DArray(size_type cols, const T& t = T()) { Create(cols, t); }
1DArray(const 1DArray& arr) { Create(arr.begin(), arr.end()); }
1DArray& operator=(const 2DArray&);
~1DArray() { Uncreate(); }
T& operator[](size_type n) {
return array1d_[n];
}
const T& operator[](size_type n) const {
return array1d_[n];
}
}
4 ответов
правила для имен идентификаторов в C++ являются:
- он не может начинаться с числа
- может состоять из букв, цифр, подчеркивания, имена универсальных символов1 и реализации символы
- не может быть ключевое слово.
разделы проект стандарта C++ что покрывают это 2.11
коды что включает в себя следующую грамматику:
identifier:
identifier-nondigit <- Can only start with a non-digit
identifier identifier-nondigit <- Next two rules allows for subsequent
identifier digit <- characters to be those outlined in 2 above
identifier-nondigit:
nondigit <- a-z, A-Z and _
universal-character-name
other implementation-defined characters
[...]
и 2.12
ключевые слова объясняет все идентификатор зарезервированы для использования в качестве ключевых слов.
наконец, следующие имена также зарезервированы:
- имена, содержащие двойное подчеркивание
__
, или начните с подчеркивания, за которым следует заглавная буква (например,_Apple
) в любой области, - имена, начинающиеся с подчеркивания в глобальном пространстве имен (как
_apple
в глобальном пространстве имен) зарезервированы.
раздел, который охватывает в проект стандарта и 17.6.4.3.2
. Мы можем найти обоснование того, почему они зарезервированы от обоснование международного стандарта-языки программирования-C он говорит:
[...]Это дает пространство имен для написания многочисленных закулисных не внешних макросов и функций, необходимых библиотеке для выполнения своей работы правильно.[..]
на C++ это также относится к имя коверкая как это пример показывает.
сноски
- 1. Разрешенные универсальные символы
универсальные символы, которые разрешены, покрыты Annex E.1
:
E. 1 допустимые диапазоны символов [charname.разрешено]
00A8, 00AA, 00AD,
00AF, 00B2-00B5, 00B7-00BA, 00BC-00BE, 00C0-00D6, 00D8-00F6, 00F8-00FF
0100-167F, 1681-180D, 180F В-ЭТОГО ЗНАЧЕНИЯ 1FFF 200В-200D С, 202А-202E, 203F-2040, 2054,
2060-206F 2070-218F, 2460-24FF, 2776-2793, 2C00-2DFF, 2E80-2FFF
3004-3007, 3021-302F, 3031-303F
3040-D7FF F900-FD3D, FD40-FDCF,
FDF0-FE44, FE47-FFFD
10000-1FFFD, 20000-2FFFD, 30000-3FFFD, 40000-4FFFD, 50000-5FFFD, 60000-6FFFD, 70000-7FFFD, 80000-8FFFD, 90000-9FFFD, A0000-AFFFD, B0000-BFFFD, C0000-CFFFD, D0000-DFFFD, E0000-EFFFD
поскольку, как ни странно, я не смог найти дубликат или более общую версию этого вопроса, вот ответ, основанный на том, что говорит стандарт (C++11).
прежде всего, §9/1, имя класса является идентификатор (или простой-шаблон-id в случае специализации шаблона, но простой-шаблон-id состоит из коды).
§2.11 определяет, что является допустимым идентификатор есть. Сначала он вводит несколько основных понятий:
A цифры одна из них: 0 1 2 3 4 5 6 7 8 9
А nondigit одна из них: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
А универсальный-характер-имя - это последовательность типа \unnnn
или \Unnnnnnnn
(где n
является шестнадцатеричной цифрой)
затем стандарт определяет идентификатор-nondigit as
- либо a nondigit
- или универсальный-характер-имя
- или определенный реализацией специальный символ(‡)
наконец, идентификатор определяется рекурсивно как
идентификатор:
идентификатор-nondigit
идентификатор идентификатор-nondigit
идентификатор цифры
Summary: другими словами, идентификатор должен начинаться с (не цифры!) алфавитный символ, за которым может следовать все, что состоит из буквенно-цифровых символов, подчеркивания и \unnnn
-как ссылки на символы. Все остальное зависит от реализации.
(‡) поддерживаются ли они, зависит от вашего компилятора, и их использование обычно означает вы теряете переносимость на другие компиляторы или версии компилятора.
имена в C++ должны начинаться с "буквы", где буква-это весь верхний и нижний регистр "A-Z, a-z". '_' считается 'письмо'. За ним может следовать любая комбинация букв и цифр.