【问题标题】:Is it possible to use the ternary operator "?" to fill an array list in C/C++?是否可以使用三元运算符“?”在 C/C++ 中填充数组列表?
【发布时间】:2015-07-10 22:48:17
【问题描述】:

这可能是一个愚蠢的问题。我正在修改别人开发的代码。我需要根据逻辑变量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。谢谢

【问题讨论】:

    标签: c++ c ternary-operator


    【解决方案1】:

    我认为你不能用不同大小的数组初始化器来做到这一点。但是,您可以在初始化程序中放置一个条件表达式:

    const char* VarList [] = {"X", "Y", ThreeDim == 1 ? "Z" : nullptr};
    

    这将始终为您提供一个 3 元素数组,其中最后一个元素为“Z”或空指针。

    【讨论】:

    • 谢谢。它现在编译。再次感谢...现在,我只需要解决SIGSEGV :( 遗留代码...
    • 注意最后一个空元素。也可能是段错误的原因。
    • 谢谢@vitaut。最后,我使用了@GregHewgill 提出的解决方案。并在有和没有#define 行的情况下编译,为每种情况生成不同的可执行文件。谢谢
    【解决方案2】:

    不,因为例如{"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"}};
    

    【讨论】:

    • 感谢您的回答。并且同意,对象的类型远非最佳。但正如我所说,代码不是我的,如果没有下游的重大修改,我无法更改对象类型
    【解决方案3】:

    您可以考虑使用预处理器#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
    

    【讨论】:

    • 最后这是我使用的解决方案。语法问题较少的一种。
    【解决方案4】:

    根据C11 6.7.9,数组不是用表达式初始化的,而是用一个初始化列表;这是两种不同的句法元素,不能混用。这是因为数组不可赋值,因此将数组视为一个值(与衰减为指针的值相反)是没有意义的。由于它们不是值,因此无法创建传递整个数组的合法表达式。

    与您所要求的最接近的直接类似物是:

    const char** VarList = ThreeDim==1 ? (const char*[]){"X","Y","Z"} : (const char*[]){"X","Y"};
    

    ...但这是以更改VarList 的类型为代价的,并且可能不是您想要的。

    【讨论】:

    • 好主意,但是on ideone.com 这给出了“错误:获取临时数组的地址”,这似乎是正确的......?
    • @TonyD in C 获取临时数组的地址不是错误,我想这是另一个 C/++ 差异。
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2016-10-04
    • 2021-10-06
    • 2012-06-02
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多