static const int LOG_MAX = 31;
static int log_table[LOG_MAX];
此代碼是在C函數內當我嘗試編譯我的錯誤:靜態數組功能錯誤C的內部
"main.c:19:16: error: storage size of 'log_table' isn't constant".
我不明白這一點,因爲LOG_MAX
是const
。
只是爲了澄清這是C代碼,我正在使用GCC。
static const int LOG_MAX = 31;
static int log_table[LOG_MAX];
此代碼是在C函數內當我嘗試編譯我的錯誤:靜態數組功能錯誤C的內部
"main.c:19:16: error: storage size of 'log_table' isn't constant".
我不明白這一點,因爲LOG_MAX
是const
。
只是爲了澄清這是C代碼,我正在使用GCC。
在舊的C和C++標準,陣列數組的邊界必須是在編譯時評估的常量字面值。 A const
變量不需要在編譯時進行評估,它可以在運行時創建爲局部變量。另外,正如另一個答案中指出的那樣,const
實際上應該被視爲只讀而不是其他任何內容。
在所有C和C++標準中,static
數組的大小必須始終使用常量字面值設置。 (或者是挑剔的,這適用於與靜態存儲時間任何變量)
在新的C類標準(C99,C11)但是,如果你離開了static
關鍵字,您發佈的代碼是完全正常的。然後它會創建一個可變長度的數組(VLA),這可能是或者可能不是你想要做的。
我不確定最新的C++ 11標準,但據我所知它不支持VLA。
這是無效的C,即使int
是常量和靜態。 我會建議做一些像
#define LOG_MAX 31
static int log_table[LOG_MAX];
c99中不支持具有靜態存儲持續時間的@svk可變長度數組。 – ouah
@svk不適用於靜態數組,即使在C99中也是無效的。 – dasblinkenlight
哦,我的錯誤,沒有注意到'靜態'。 – svk
const
並不意味着常數C,而是爲只讀。 LOG_MAX
在您的程序中不是一個常量。
這裏是有一個恆定的方式有兩種:
#define LOG_MAX 31
或
enum {
LOG_MAX = 31
};
你應該使用預處理:
#define LOG_MAX 31
static int log_table[LOG_MAX];
這將失敗,因爲一個const int
變量不被認爲是C.
但由於數組將是靜態的,可以肯定的是,「完全」宣言始終可用,即編譯時間常數它永遠不會被指針引用。因此,你可以內聯的大小和任何地方使用sizeof
,你想用LOG_MAX
:在同一個函數
static int log_table[32];
,然後在別處:
const size_t log_max = sizeof log_table/sizeof *log_table;
這使得「魔術常量」周圍,但只能在一個地方,其目的應該是非常明確的,因爲使用log_table
的方式。這完全在單一功能之內,畢竟這不是可怕的全球數據。
也許可以使用#define? –
你在問什麼編程語言? C和C++是不同的語言,在這種情況下,您將得到不同的答案,具體取決於所使用的編程語言標準版本。 – Lundin
問題是static const的聲明,我回答了下面的問題 –