2011-01-25 50 views
4

以下代碼有什麼問題?文件範圍內的可變修改陣列

 
#define DELAY_CYCLES ((int)(0.1/0.001)) 
typedef struct { 
    double state_history[N_X][DELAY_CYCLES]; 
    double foo; 
} foo 

GCC抱怨:

main.h:52:3:警告:在文件範圍內各種變型 'state_history'

是不是因爲INT投不能由於某種原因完成編譯時?

回答

9

再次編輯

如果按照標準的信,那麼,你應該避免浮點表達式那裏。在C中,除了浮點常量被轉換爲整數(例如(int)3.0f)之外,浮點表達式在編譯時不被視爲整型常量表達式,用於數組大小計算。您需要修改定義以避免使用浮點數並僅使用整數。爲了不是可變長度數組,需要數組大小爲「整型常量表達式」(C99§6.7.5.2/ 4),並且在第6.6.6節中定義了「整型常量表達式」(重點煤礦):

一種整數常量表達式96)應具有整數型和應僅具有是積分常數,枚舉常數,字符常數,sizeof表達式,其結果是積分常數,和操作數浮動常數,這些常量是強制轉換的立即操作數。在整型常量表達式中轉換運算符只能將算術類型轉換爲整數類型,除了作爲運算符sizeof的操作數的一部分。

看來GCC只在版本4.5中添加了警告。在4.4及更低版本中,即使使用-Wall -Wextra -ansi -pedantic,也不會報告該代碼的任何警告。但是,爲了安全和100%便攜,您應該更改DELAY_CYCLES的定義以避免浮點表達式。

+0

我使用的是gcc 4.5.2。即使將N_X取出,我也會收到警告。不必使用任何額外的警告標誌。 – allanw 2011-01-25 03:44:47

3

即使它是一個整數常量表達式,(int)(0.1/0.001)可以很容易地要麼99或100中,由於值0.10.001不浮點存在。確定IEEE 754規定的值將需要檢查0.1和0.001兩者,以確定它們是否更接近其鄰居的上方或下方,然後實際上是對這些鄰居進行分割 - 或者只是在符合標準的系統上進行檢查。然而,這是我不想依賴實現來達到正確答案的地方。