2013-11-23 103 views
3

GCC給我當試圖編譯以下警告消息:25:警告:初始值設定元素不是常量表達式

las.c:13:18: warning: initializer element is not a constant expression [enabled by default] 
const int ROWS = pow (2, MESH_K); 

相關的代碼部分,用於這是:

#define MESH_K 10 
#define BUFF_SIZE 30 

const int ROWS = pow (2, MESH_K); 

我需要在代碼的後面幾點使用MESH_K和ROWS。我明白函數調用可能會讓GCC相信這不是一個常量表達式。然而,由於對pow的調用本質上是一個常量,是否有更好的方法來實現它(預處理器宏也許?)並消除警告?

我不介意犧牲這部分代碼的性能可讀性,因此歡迎任何和所有複雜的解決方案。

+4

不知道這是否會工作,而是嘗試'const int ROWS = 1 << MESH_K;'來代替。 –

+0

作品!併爲更優化的解決方案提供獎勵。不過,如果你能幫助並使編譯時間保持不變,我將不勝感激。 – darnir

+1

然後試試這個:'#define POW_2_MESH_K 1 << MESH_K' –

回答

4

我相信你的回答是here

這將編譯用C++罰款,但不是在C.

它與C語言做。在具有靜態 的C語言對象中,存儲持續時間必須用常量表達式或帶有包含常量表達式的聚合初始化程序的 進行初始化。

即使 對象被聲明爲const,「large」對象也不會是C中的常量表達式。此外,在C語言中,術語「常量」是指文字 常量(如1,'a',0xFF等等)和枚舉成員。 C語言 術語中的Const-qualified對象(任何類型)不是常量。不管它們的類型如何,它們都不能用於靜態存儲持續時間爲 的對象的初始化程序中。

一樣嬌氣說,const int ROWS = 1 << MESH_K;將工作,但:

int test = 10; 

const int ROWS = 1 << test; 

將無法​​工作。我的猜測是MESH_K作爲文字被粘貼到代碼中,因此解析爲C常量。

+0

我經歷了很多關於這個主題的問題。然而,我的問題更多的是關於什麼是更好的方式來實現這一點,所以ROWS的價值是不變的? – darnir

+0

@darnir那麼你用'constant'表示什麼意思?該值在編譯時而不是運行時已知? – 2013-11-23 01:54:18

+0

是的。由於所涉及的所有值在編譯時確實已知,因此我認爲在編譯時自己計算它是個好主意。我意識到性能增益不是微不足道的,但現在,我都試圖削減微秒,並想學習新的東西。 – darnir