您可以使用三元運算符,但請記住,對於具有靜態或線程本地存儲類對象的初始化表達式必須是一個編譯時間常數:
const int bar = 42;
#define BAR 42
#if 0
const int foo = bar ? 1 : 2; /*ERROR -- bar is not an integer constant */
#else
const int foo = BAR ? 1 : 2;
#endif
void fn(void)
{
const int foo = bar ? 1 : 2;
#if 0
static const int stc_foo = bar ? 1 : 2; /*ERROR*/
#else
static const int stc_foo = BAR ? 1 : 2;
#endif
}
的原因是if-else語句不能用於初始化,因爲允許它需要對C語法進行一些相當廣泛的更改,並且可能會使C語法和語義更加複雜。
基本上,而不是簡單地具有以驗證該聲明符之後是=
和initializer
表達並且該初始化表達式是一個常數,編譯器將不得不記住每個靜態/線程局部變量還沒有被初始化,然後查找無條件執行的編譯時可評估分支,並將其分配給它並用於初始化。
此外,必須允許在文件範圍內聲明(語句在當前C語法中不允許在文件範圍內),並且對限制寫入translation-unit-local全局變量的constness和內存訪問進行驗證。或者,它們可以隱式轉化爲全局構造函數,但是這會引入其他問題,例如編譯單元之間的構造函數排序(如果構造函數的生成是隱式的,將很難解決),需要實現在第一個時候支持全局構造函數地點,或靜態變量分配的當前相當簡單的性能特徵的模糊。
因爲初始化'const'發生在定義點,並且由編譯器執行。而在運行時執行'if'語句之後,所有變量都已定義。 – Peter
請注意'foo = 1;'不是_initialization_。它是_assignment_,即使這是第一次在這裏賦予'foo'值。 'int foo = 42;'是_initialization_的一個例子。 – chux
@jhourback我試圖解釋爲什麼這是不可能的,我理解它的方式。請看看我的編輯。 – PSkocik