在一個項目中,我需要定義一個const int的,我的頭將其定義爲:如何正確定義.h文件中的const int?
extern const int a;
我包括頭多次。然後在只有一個源文件中,我把:
const int a=10;
但是,當我需要在數組綁定;即:
int anarray[a];
我得到:
"array bound is not an integer constant"
錯誤。爲什麼?
在一個項目中,我需要定義一個const int的,我的頭將其定義爲:如何正確定義.h文件中的const int?
extern const int a;
我包括頭多次。然後在只有一個源文件中,我把:
const int a=10;
但是,當我需要在數組綁定;即:
int anarray[a];
我得到:
"array bound is not an integer constant"
錯誤。爲什麼?
一個數組綁定必須是一個積分常量表達式。是一個積分常數表達式的表達式必須只涉及(除其他一些東西)文字,enum
值和const
變量或static
數據成員只有當它們與恆定表達式初始化。
const
整型變量不是積分常量表達式如果它們沒有初始值設定項。
這是一個語言規則,允許實施在編譯時知道某一恆定值,而無需知道其他的翻譯單元(這可能不是在同一時間進行編譯,並且可以獨立地改變)。
const
默認情況下,命名空間範圍內的變量具有內部鏈接(即,沒有明確的extern
),因此,如果您執行類似操作,則不會出現任何多重定義問題。
// header.h
const int a = 10;
。
// source.cpp
int anarray[a];
如果它真的沒有改變,爲什麼不直接做一個#define呢?
在編譯時需要知道數組維數。對於這樣的常量,您可能需要考慮使用枚舉。這樣它的值在頭文件中可見,並且在調試時仍然可以獲得符號名稱(與使用#define不同)。
// foo.h
enum {
a = 10; // array dimension
};
和
// foo.c
#include "foo.h"
int anarray[a];
我不知道我明白'enum {a = 10; };'已經超過'const int a = 10;'。你能擴展嗎? – 2010-11-18 22:31:57
@Charles:你不能可靠地把'const int a = 10;'放在一個.h文件中 - 有些編譯器可以讓你避開它,有些則不會。 – 2010-11-18 22:45:16
@保羅R:呃,我可以。你究竟是什麼意思? – 2010-11-18 22:46:05
的恆定需求的值,以在編譯時是已知的。 extern
變量不是這樣的:如果有的話,它們的值只能在鏈接時確定,其中後面的爲編譯步驟。所以就編譯器而言,一個extern
是不是一個常量。
#應該避免#defines,這取決於包含標題的順序,你可以無意中改變某些東西。 – ThomasW 2014-10-16 09:23:50