14

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

4 回答 4

27

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. 我们可以从Rationale for International Standard-Programming Languages-C中找到为什么保留这些的理由,其中说:

[...]这为编写大量幕后的非外部宏和函数提供了一个名称空间,库需要正确完成其工作 [...]

如本所示,在C++中,这也适用于 名称修饰。


脚注

  • 1.允许通用字符

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

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

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-DFFFD-C0000-CF DFFFD, E0000-EFFFD

于 2013-03-08T02:45:16.323 回答
4

简单回答是不。以你为例,为什么不称它为 OneDArray?

于 2013-03-08T02:44:51.133 回答
4

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

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

§2.11 定义了有效标识符是什么。首先介绍几个基本概念:

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

然后标准将标识符非数字定义为

  • 要么是非数字
  • 通用字符名称
  • 或实现定义的特殊字符(‡)

最后,标识符被递归定义为

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

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


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

于 2013-03-08T04:01:30.107 回答
1

C++ 中的名称必须以“字母”开头,其中字母全部为大写和小写“AZ, az”。'_' 也算作“字母”。然后可以在其后跟字母和数字的任意组合。

于 2013-03-08T02:46:39.653 回答