Вы можете начинать имя класса с цифры?

на 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. он не может начинаться с числа
  2. может состоять из букв, цифр, подчеркивания, имена универсальных символов1 и реализации символы
  3. не может быть ключевое слово.

разделы проект стандарта 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 ключевые слова объясняет все идентификатор зарезервированы для использования в качестве ключевых слов.

наконец, следующие имена также зарезервированы:

  1. имена, содержащие двойное подчеркивание __, или начните с подчеркивания, за которым следует заглавная буква (например,_Apple) в любой области,
  2. имена, начинающиеся с подчеркивания в глобальном пространстве имен (как _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
  • или универсальный-характер-имя
  • или определенный реализацией специальный символ(&ddagger;)

наконец, идентификатор определяется рекурсивно как

идентификатор:
  идентификатор-nondigit
  идентификатор идентификатор-nondigit
  идентификатор цифры

Summary: другими словами, идентификатор должен начинаться с (не цифры!) алфавитный символ, за которым может следовать все, что состоит из буквенно-цифровых символов, подчеркивания и \unnnn-как ссылки на символы. Все остальное зависит от реализации.


(&ddagger;) поддерживаются ли они, зависит от вашего компилятора, и их использование обычно означает вы теряете переносимость на другие компиляторы или версии компилятора.


простой ответ-нет. Например, почему бы не назвать его OneDArray?


имена в C++ должны начинаться с "буквы", где буква-это весь верхний и нижний регистр "A-Z, a-z". '_' считается 'письмо'. За ним может следовать любая комбинация букв и цифр.