是否可以使用三元运算符“?”在 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::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
到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
的类型为代价的,并且可能不是您想要的。
这大概是个白痴问题。我正在修改别人开发的代码。我需要根据逻辑变量 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
到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
的类型为代价的,并且可能不是您想要的。