通過常量表示式初始化的const變數定義在標頭檔案中

2021-07-24 17:11:30 字數 755 閱讀 6820

《c++primer》中,講到頭檔案中不可以包含定義,有三個例外:類,常量表示式初始化的const物件,inline。

對於不是用常量表示式初始化的const物件,可以加上extern放在原始檔中,並在標頭檔案中加上extern宣告。

但是對於用常量表示式(即編譯器就可以確定的)初始化的const物件,是不可以這麼做,而要將定義全部放在標頭檔案中,原因是該const物件用常量表示式初始化,那麼該物件自身也可以作為乙個常量表示式為其他物件初始化,而當它作為常量表示式時,其初始化必須為編譯器可見,如果將物件的定義放在原始檔中,編譯階段還沒有鏈結到它的定義,因此編譯器不知道他的具體初始化式,會報錯,因此將它的定義直接都放在.h標頭檔案中,這樣編譯器可以直接找到初始化式,同時由於const的特性,const物件在定義它的檔案中是區域性變數,因此即使多個檔案包含該標頭檔案,也不會重定義報錯。

下面是**驗證,enum的特性是它的成員初始化式必須是常量表示式,如果將用常量表示式初始化的const物件放在原始檔中,編譯器會報錯,因為找不到a的具體定義。

a.h

extern const int a;
a.cpp

extern const int a = 3;

main.cpp

#include"a.h"

#includeusing namespace std;

enum day;

int main();

int main(){

cout <

常量表示式

字面值 是乙個不能改變的值,如數字 字元 字串等。單引號內的是字元字面值,雙引號內的是字串字面值。字面值型別 literal type 算數型別 引用和指標等。常量表示式 const experssion 是指 1 值不會改變 並且 2 在編譯過程就能得到計算結果的表示式。字面量屬於常量表示式,用常...

常量表示式

為了使函式獲取編譯時計算的能力,你必須指定constexpr關鍵字到這個函式。constexpr int multiply int x,int y 將在編譯時計算 const int val multiply 10,10 除了編譯時計算的效能優化,constexpr的另外乙個優勢是,它允許函式被應用...

解析常量表示式

define crt secure no warnings include include include intisnum char ch void eatspace char str char roundbmatch char str,int pindex double getnum char ...