2012-03-06 11 views
0

GCC不喜歡下面的代碼:如何讓gcc將包含函數調用的表達式識別爲常量?

inline const plus(unsigned x,unsigned y) __attribute__((pure)); 
inline const plus(unsigned x,unsigned y) { return x+y; } 

int arr[plus(1,1)]; 

它引發以下錯誤:

error: variably modified ‘arr’ at file scope 

的唯一的事情是,我所做的一切我能想到的,告訴GCC可以優化加一個(a,b)到「a + b」的調用,而我只傳遞了常量,所以結果應該是是恆定的!

我錯過了什麼使這項工作?或者gcc只是不那麼聰明?

順便說一句,使用加號(1,1)而不是1 + 1的原因是它使用宏來構建數組大小的更一般的構造。

+0

使'plus'成爲一個宏。 – 2012-03-06 22:54:23

+0

你的'加號'沒有返回類型。另外,你需要一個*常量表達式*,函數調用的結果不是。 (在C++ 11中,您可以執行其他操作,以使其正常工作。) – 2012-03-06 22:55:42

回答

2

可能有gcc擴展允許類似這樣的事情,但至少在標準C中,函數調用永遠不會被視爲常量表達式,無論您添加了多少個const,或者它實際上有多恆定。您可能需要使用宏來代替:

#define plus(x, y) ((x)+(y)) 
1

據我瞭解,爲arr[]內存邏輯甚至之前主要分配()被調用,所有靜態變量的初始化保證是完整的,並且編譯器沒有(被允許)足夠聰明以在所有靜態初始化之前確定你所引用的函數是否可以安全地調用。

換句話說,唯一的方法就是(正如Thomas在他的回答中所做的那樣)使用#define宏,它在編譯時被評估爲常量2

相關問題