Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用三元运算符“?”来填充C/C++中的数组列表?_C++_C_Ternary Operator - Fatal编程技术网

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

是否可以使用三元运算符“?”来填充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

这可能是一个愚蠢的问题。我正在修改别人开发的代码。我需要详细说明一些基于逻辑变量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};
这将始终为您提供一个包含最后一个元素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/++的区别。最后,这就是我使用的解决方案。语法问题较少的那个。