是否可以使用三元运算符“?”在 C/C++ 中填充数组列表?

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::vectorstd::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到select一个或另一个代码来编译:

#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 的类型为代价的,并且可能不是您想要的。