2010-11-18 63 views
1

在一個項目中,我需要定義一個const int的,我的頭將其定義爲:如何正確定義.h文件中的const int?

extern const int a; 

我包括頭多次。然後在只有一個源文件中,我把:

const int a=10; 

但是,當我需要在數組綁定;即:

int anarray[a]; 

我得到:

"array bound is not an integer constant" 

錯誤。爲什麼?

回答

10

一個數組綁定必須是一個積分常量表達式。是一個積分常數表達式的表達式必須只涉及(除其他一些東西)文字,enum值和const變量或static數據成員只有當它們與恆定表達式初始化。

const整型變量不是積分常量表達式如果它們沒有初始值設定項。

這是一個語言規則,允許實施在編譯時知道某一恆定值,而無需知道其他的翻譯單元(這可能不是在同一時間進行編譯,並且可以獨立地改變)。

const默認情況下,命名空間範圍內的變量具有內部鏈接(即,沒有明確的extern),因此,如果您執行類似操作,則不會出現任何多重定義問題。

// header.h 
const int a = 10; 

// source.cpp 
int anarray[a]; 
0

如果它真的沒有改變,爲什麼不直接做一個#define呢?

+1

#應該避免#defines,這取決於包含標題的順序,你可以無意中改變某些東西。 – ThomasW 2014-10-16 09:23:50

4

在編譯時需要知道數組維數。對於這樣的常量,您可能需要考慮使用枚舉。這樣它的值在頭文件中可見,並且在調試時仍然可以獲得符號名稱(與使用#define不同)。

// foo.h 

enum { 
    a = 10; // array dimension 
}; 

// foo.c 

#include "foo.h" 

int anarray[a]; 
+1

我不知道我明白'enum {a = 10; };'已經超過'const int a = 10;'。你能擴展嗎? – 2010-11-18 22:31:57

+0

@Charles:你不能可靠地把'const int a = 10;'放在一個.h文件中 - 有些編譯器可以讓你避開它,有些則不會。 – 2010-11-18 22:45:16

+0

@保羅R:呃,我可以。你究竟是什麼意思? – 2010-11-18 22:46:05

2

的恆定需求的值,以在編譯時是已知的。 extern變量不是這樣的:如果有的話,它們的值只能在鏈接時確定,其中後面的爲編譯步驟。所以就編譯器而言,一個extern不是一個常量。