你能用数字开始一个班级名字吗?

时间:2013-03-08 02:40:01

标签: c++ class naming

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 个答案:

答案 0 :(得分:25)

C ++ 中的标识符名称规则为:

  1. 不能以数字开头
  2. 可以由字母,数字,下划线,通用字符名称 1 实现定义字符组成
  3. 不能是keyword
  4. C++ draft standard中涵盖此内容的部分是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)。
    3. 草案标准中涵盖此内容的部分为17.6.4.3.2。我们可以从Rationale for International Standard—Programming Languages—C中找到保留这些内容的理由:

        

      [...]这给了一个名称空间,用于编写众多幕后非外部宏和库需要正常工作的函数[...]

      C ++ 中,这也适用于此name mangling显示的example


      脚注

      • 1。允许的通用字符

      允许的通用字符包含在Annex E.1

        

      E.1允许的字符范围[charname.allowed]

           <00> 00A8,00AA,00AD,

           

      00AF,00B2-00B5,00B7-00BA,00BC-00BE,00C0-00D6,00D8-00F6,00F8-00FF

           

      0100-167F,1681-180D,180F-1FFF 200B-200D,202A-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

答案 1 :(得分:4)

简单的答案是否定的。为什么你不称之为OneDArray?

答案 2 :(得分:4)

令人惊讶的是,我无法找到此问题的重复版本或更一般版本,这里是基于标准(C ++ 11)所说的答案。

首先,根据§9/ 1,类名是标识符(或者在模板专业化的情况下是 simple-template-id ,但是 simple-template-id 也由标识符组成。

§2.11定义了有效的标识符是什么。它首先介绍了一些基本概念:

数字就是其中之一:0 1 2 3 4 5 6 7 8 9
nondigit 就是其中之一:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
通用字符名称\unnnn\Unnnnnnnn类型的序列(其中每个n是十六进制数字)

标准然后将 identifier-nondigit 定义为

  • nondigit
  • 通用字符名称
  • 或实现定义的特殊字符(‡)

最后,标识符以递归方式定义为

  

标识符
  标识符非数字
  标识符 标识符非数字
  标识符

摘要:换句话说,标识符必须以(非数字!)字母字符开头,后面可以跟任何由字母数字字符,下划线和\unnnn组成的字符,如字符引用。其他任何东西都是特定于实现的。


(‡)是否支持任何内容取决于您的编译器,使用它们通常意味着您将失去对其他编译器或编译器版本的可移植性。

答案 3 :(得分:1)

C ++中的名称必须以'letter'开头,其中letter是大写和小写'A-Z,a-z'。 '_'也算作'字母'。然后可以跟随字母和数字的任何组合。