2009-11-07 183 views
11

初始化大小定義爲extern const的數組時,出現問題。 我一直遵循的規則是全局變量應該在頭文件中聲明爲extern,並且它們的相應定義應該放在其中一個實現文件中,以避免可變的重新聲明錯誤。這種方法運行良好,直到我不得不初始化一個數組,其大小定義爲一個extern const。 我收到一個錯誤,表示一個常量表達式。但是,如果我試圖給const變量賦值,編譯器會正確地抱怨一個值不能被賦值給一個常量變量。這實際上證明編譯器確實將該變量看作一個常量。那麼爲什麼在嘗試聲明相同大小的數組時報告了錯誤?聲明大小聲明爲extern的數組const

有沒有什麼辦法避免這種情況,而不使用#define?我也想知道這個錯誤的原因。

Package.h:

#ifndef PACKAGE_H 
#define PACKAGE_H 

extern const int SIZE; 

#endif 

Package.cpp:

#include "Package.h" 

const int SIZE = 10; 

Foo.cpp中:

#include "Package.h" 

int main() 
{ 
    // SIZE = 5; // error - cannot assign value to a constant variable 
    // int Array[SIZE]; // error - constant expression expected 
    return 0; 
} 
+0

您可以使用四個空格縮進代碼以對其進行格式化。 – Thomas 2009-11-07 14:16:28

回答

16

該常量是外部的,因此它在另一個編譯單元(.o文件)中定義。因此,編譯器無法在編譯時確定數組的大小;直到鏈接時間才知道常數的值是多少。

3

好,它看到變量,常量合格,不作爲的常數表達

2

我相信這裏的問題是,如果你聲明你的變量爲extern,它可以在不同的模塊(.o文件)中,甚至在動態庫(.dll/.so)中。這當然意味着,編譯器可能無法在編譯時解析變量內容,從而拒絕在需要const的地方使用該值。

我的意見是,在這裏完全可以不使用extern並直接在頭文件中聲明它,因爲它是一個int值,無論如何將在代碼中的任何位置使用內聯。我通常只在使用字符串時才使用extern const,因爲我想確保在運行時只生成一個字符串實例。

3

因爲它只是一個int我會刪除extern並將其定義爲一個定義而不是聲明。我這樣說的原因是,即使這種方法在包含頭文件的每個源文件中放置了一個單獨的整數實例,我想大多數編譯器都會優化它的使用。事實上,編譯器不可能優化它的使用,如果不這樣做,它不會從簡單的算術表達式中優化出來。

由於它被宣佈爲const它將具有內部鏈接,因此您不會通過這種方式獲得任何多重定義的符號問題。

+0

謝謝。我想我現在明白了。但是,爲什麼這種方法不適用於const指針。如果我在頭文件中定義了const char * FILE_NAME =「Log.txt」並將頭文件包含在多個源文件中,我仍然會收到鏈接錯誤。我沒有聽到const char FILE_NAME [] =「Log語句的錯誤。txt「 – psvaibhav 2009-12-06 14:13:22

+0

@psvaibhav:這不起作用,因爲'const char *'聲明指針是一個指向const的指針,而不是一個常量指針,你需要的是'*'後面的一個額外的'const'指針本身的常量,例如'const char * const' – Troubadour 2009-12-06 22:29:40