2013-03-29 45 views
1

我在正確的方式中定義我在代碼中使用的常量時遇到了一些問題。儘管我在How do I use extern to share variables between source files?上看過Jonathan Leffler的優秀帖子,但我似乎誤解了一些東西。這是設置:常量的正確定義

/* constants.h */ 
extern int NUM_PARTICLES; 
extern int LIGHTSPEED; 

此頭在random.hmain.c和使用,其看起來像

#include "constants.h" 
int NUM_PARTICLES=104; 
random.h分別

#include "constants.h" 
int LIGHTSPEED=104; 
main.c

,。 NUM_PARTICLES在main.c中使用

30: double ghosts[NUM_PARTICLES][4]; 
31: double output[NUM_PARTICLES][3]; 

雖然這個事情的作品,我得到以下警告,

main.c: In function ‘int main()’: 
main.c:30:32: warning: ISO C++ forbids variable length array ‘ghosts’ [-Wvla] 
main.c:31:32: warning: ISO C++ forbids variable length array ‘output’ [-Wvla] 

這是奇怪的,因爲在我看來,我做數組常量在編譯時已知的值。 (通常這些數組長度錯誤會導致一些段錯誤,在這種情況下它們不會)。任何想法?

+0

除了你的問題,因爲這樣的,你有你正在編譯C代碼爲C++,這個問題該不是一個好主意。特別是''const'限定變量的處理在兩者之間是不同的。 –

+0

是的,我有那種鬼鬼祟祟的感覺,用C++混合C會導致一些問題,但不幸的是我無法改變它; D –

回答

5

簡單地說:這是C.

通常的怪癖,你會定義爲

const int LIGHTSPEED = 104; 

問題的一個整數常數是根據語言規則這個常數是不是不變表達式,因此不能用於指定靜態分配數組的大小。

C標準的相關部分(6.6/6,我不使這個向上)定義了一個整數常量表達式是:

一個整數常量表達式應整型並須 只有操作數是整數常量,枚舉常量, 字符常量,sizeof表達式的結果爲整型 常量,以及浮點型常量,它們是 轉換的立即操作數。

有兩種解決方案。經典的一種是使用一個宏,它簡單地粘貼尖括號之間104編譯器看到的代碼之前,因此使數組大小的整數常數:

#define NUM_PARTICLES 104 

的更好的(IMO)是避免宏,因爲你可以,並使用enum,這是可能的(您使用的是枚舉常量):

enum { NUM_PARTICLES = 104 }; 
+0

很酷,謝謝!使用枚舉完美的作品:) –