[英]Is it possible to use the ternary operator “?” to fill an array list in C/C++?
這可能是一個愚蠢的問題。 我正在修改由其他人開發的代碼。 我需要根據邏輯變量ThreeDim
一些字符數組的值。 我試圖這樣做沒有成功。
int VarNumber = ThreeDim==1 ? 3 : 2;
const char* VarList [] = ThreeDim==1 ? {"X","Y","Z"} : {"X","Y"};
但編譯器給我的錯誤就像
error: expected ‘;’ before ‘}’ token
error: initializer fails to determine size of ‘VarList’
由於下游要求, VarList
需要是一個const char*
。 它的大小應該是VarNumber
。 謝謝
我不認為你可以用不同大小的數組初始化器來做到這一點。 但是,您可以在初始化程序中放置條件表達式:
const char* VarList [] = {"X", "Y", ThreeDim == 1 ? "Z" : nullptr};
這總是會給你一個3元素數組,最后一個元素是“Z”或空指針。
不,因為例如{"X","Y","Z"}
不是表達式 。 它由編譯器專門處理變量定義。
如果你正在編程C ++,你應該使用std::vector
和std::string
,那么它會非常簡單(但是很冗長):
std::vector<std::string> VarList = ThreeDim==1 ?
std::vector<std::string>{{"X","Y","Z"}} :
std::vector<std::string>{{"X","Y"}};
您可以考慮使用預處理器#define THREE_DIM
,然后使用#ifdef
選擇要編譯的一個或另一個代碼:
#define THREE_DIM
#ifdef THREE_DIM
int VarNumber = 3;
const char* VarList [] = {"X","Y","Z"};
#else
int VarNumber = 2;
const char* VarList [] = {"X","Y"};
#endif
根據C11 6.7.9,數組不是用表達式初始化,而是用初始化列表初始化 ; 這些是兩種不同的句法元素,不能混合使用。 這是因為數組不可分配,因此將一個數據視為一個值(而不是一個衰減為指針的值)因此沒有意義。 由於它們不是值,因此無法創建繞過整個數組的合法表達式。
與您要求的最接近的直接類比是:
const char** VarList = ThreeDim==1 ? (const char*[]){"X","Y","Z"} : (const char*[]){"X","Y"};
...但這是以更改VarList
類型為VarList
,可能不是你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.