2013-03-08 103 views
11

In 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]; 
     } 
} 
+0

您可能在類名底部有數字... – 2013-03-08 02:44:41

+1

將它重命名爲Array,因爲它是默認的..一個維度。那麼如果你有一個二維的人,就叫它Array2D。 – Rapptz 2013-03-08 02:52:16

回答

24

規則在C++標識符名稱是:

  1. 它不能以數字
  2. 可以由字母開始,數字,下劃線,通用字符名和實現定義 characters
  3. 不能是keyword

在覆蓋此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關鍵詞解釋了所有標識符用作關鍵字保留。

最後,下面的名稱也保留:含有以雙下劃線__,或與任一一個下劃線隨後以任何範圍大寫字母(如_Apple)開始

  1. 名稱,
  2. 名稱以全局名稱空間中的下劃線開頭(如全局名稱空間中的_apple)將被保留。

草案標準中涵蓋此的部分是17.6.4.3.2。我們可以找到爲什麼這些從Rationale for International Standard—Programming Languages—C保留的理由其中說道:

[...]這給出了一個名字空間寫的衆多幕後的非外部宏和函數庫需求正確工作[...]

C++這也適用於name mangling因爲這example節目。


腳註

  • 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,C0000-CFFFD,D0000-DFFFD, E0000-EFFFD

+0

對於任何類C語言,或者至少幾乎所有語言都是如此。 – 2013-03-08 02:47:37

+2

說明:包含雙下劃線或以下劃線開頭,後跟大寫字母,或以全局範圍中的下劃線開頭。 – chris 2013-03-08 02:50:22

+0

@chris感謝您的澄清,編輯我的文章。 – 2013-03-08 02:53:37

3

簡單的答案是否定的。對你來說,爲什麼不叫它OneDArray?

+2

這很醜陋,你正在解決錯誤的問題。不要用別的東西代替數字,爲什麼不把名字改成例如'Array1D'? – jv110 2017-12-13 07:17:35

+0

但無論如何,這個答案沒有幫助。 – jv110 2017-12-13 07:20:03

1

名稱在C++必須開始一個 '信',其中字母是所有的上,下案例'AZ,a-z'。 '_'也被視爲'字母'。然後可以跟隨任何字母和數字的組合。

+0

那麼_2DArray應該可以嗎? – Cindeselia 2013-03-08 04:56:59

+1

@Cindeselia所依賴的,全局名稱空間中以'_'開頭的任何名字都被保留,不應該被使用。這個前面的線程闡明瞭全局比較。非全局命名空間,如果你不確定http://stackoverflow.com/questions/10269012/global-scope-vs-global-namespace – 2013-03-08 05:05:54

+1

@Cindeselia這個前面的線程建議不要在名稱中使用前導下劃線,以確保http:/ /stackoverflow.com/questions/224397/why-do-people-use-double-underscore-so-much-in-c – 2013-03-08 05:11:31

4

因爲,令人驚訝的是,我無法找到這個問題的重複或更一般的版本,下面是基於標準(C++ 11)所說的答案。

首先,通過§9/ 1,類名是標識符(或在模板特的情況下,一個簡單- 模板id,但簡單模板id是也由標識符組成)。

§2.11定義什麼是有效的標識符是。首先介紹幾個基本概念:

數字是這些中的一個:0 1 2 3 4 5 6 7 8 9
非數字是這些中的一個:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
通用字符名稱\unnnn類型的序列或\Unnnnnnnn(其中每個n是十六進制數字)

標準然後限定標識符非數字作爲

  • 任一個非數字
  • 通用字符名稱
  • 或實現定義的特殊字符(&ddagger)

最後,標識符被遞歸地定義爲

標識符
    標識符非數字
    標識符   標識符非數字
    標識符   數字

摘要:換句話說,標識符必須以(非數字!)字母字符開頭,後面可以跟隨由字母數字字符,下劃線和類似字符引用組成的任何內容。其他任何東西都是特定於實現的。


(ddagger;)無論任何支持依賴於你的編譯器,並使用它們通常意味着你失去移植到其他編譯器或編譯器版本。

+2

謝謝你的明確總結,但我不知道爲什麼它是令人驚訝的。如果我在Google或Stack Overflow上找到答案,我不會問。遞歸的標準說話也避開了我簡單的大腦;我的理解只是將類名稱作爲標識符,然後標識符標識符非數字部分對我來說沒有任何意義。 – Cindeselia 2013-03-08 04:55:56

+0

@Cindeselia是的,當然。我對你提出這個問題並不感到驚訝。我對之前沒有人問過這個事實感到驚訝。 – jogojapan 2013-03-08 04:56:48

+0

@Cindeselia哦,關於_identifier_定義:您需要讀取每一行作爲替代。因此,_identifier_是_identifier-nondigit_或_identifier_,後跟_identifier-nondigit_或_identifier_,後跟_digit_。所以,_identifier_出現在它自己的定義中,並且可以用該定義的更多實例遞歸地替換。您可能從此形成的任何序列始終以_identifier-non-digit_開頭。 – jogojapan 2013-03-08 05:01:10