是否可以使用三元运算符“?”来填充C/C++中的数组列表?
这可能是一个愚蠢的问题。我正在修改别人开发的代码。我需要详细说明一些基于逻辑变量ThreeDim的字符数组的值。我试图这样做却没有成功是否可以使用三元运算符“?”来填充C/C++中的数组列表?,c++,c,ternary-operator,C++,C,Ternary Operator,这可能是一个愚蠢的问题。我正在修改别人开发的代码。我需要详细说明一些基于逻辑变量ThreeDim的字符数组的值。我试图这样做却没有成功 int VarNumber = ThreeDim==1 ? 3 : 2; const char* VarList [] = ThreeDim==1 ? {"X","Y","Z"} : {"X","Y"}; 但是编译器给我的错误是 error: expected ‘;’ before ‘}’ token error: initializer f
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};
这将始终为您提供一个包含最后一个元素Z或空指针的3元素数组。否,因为例如{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"}};
您可以考虑使用预处理器,定义TexEyDIM,然后使用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
根据6.7.9,数组不是用表达式初始化的,而是用初始值设定项列表初始化的;这是两种不同的句法成分,不能混用。这源于数组是不可赋值的,因此将数组视为值而不是衰减为指针的值是没有意义的。因为它们不是值,所以无法创建传递整个数组的合法表达式
与您的要求最接近的直接类比是:
const char** VarList = ThreeDim==1 ? (const char*[]){"X","Y","Z"} : (const char*[]){"X","Y"};
…但这是以更改VarList类型为代价的,可能不是您想要的。谢谢您的回答。我同意,对象的类型远远不是最佳的。但是正如我所说的,代码不是我的,我不能在没有重大修改的情况下更改对象类型。现在可以编译了。再次感谢。。。现在,我只需要解决SIGSEGV:Legacy代码…注意最后一个null元素。很可能是故障的原因。谢谢@vitaut。最后,我使用了@GregHewgill提出的解决方案。并在有定义行和无定义行的情况下编译,为每种情况生成不同的可执行文件。谢谢你的想法,但这会产生错误:获取临时数组的地址,这似乎是正确的…?@TonyD在C中获取临时数组的地址不是错误,我想这是另一个C/++的区别。最后,这就是我使用的解决方案。语法问题较少的那个。