【问题标题】:Using argv[] in CC compiler for c++在 C++ 的 CC 编译器中使用 argv[]
【发布时间】:2014-09-26 20:16:09
【问题描述】:

在 g++ 编译器中,我的程序运行良好,但是,在 CC 编译器中,我得到一个错误。

以下行:Shape s[atoi(argv[1])]; 给出了错误: 错误:数组下标运算符中需要整数常量表达式。

然后,我尝试将其更改为:int i = atoi(argv[1]);,后跟Shape s[i];,但仍然出现相同的错误。

我需要 argv[1] 因为它从命令行获取要制作多少个形状。 例如./程序 10 它应该使Team s[10];

如何让 argv[] 与 CC 编译器一起工作?

【问题讨论】:

    标签: c++ cc


    【解决方案1】:

    团队 s[10];

    将在堆栈上创建数组,但这只有在 size 是常量表达式时才有可能。如果你想要动态数组,那么你必须通过调用new[]来动态创建数组

    int size = atoi( argv[1]);
    Team* s = new Team[ size];
    

    首选std::vector<Team> tv(size);,它可以简化内存管理(毕竟,你迟早要学习 STL 库,从今天开始)。

    【讨论】:

    • 然后修复内存泄漏(最好使用std::vector,而不是更容易出错的指针杂耍)。
    • 另外,C++ 中的 VLA 是 g++ 中的一个符合标准的扩展,这就解释了为什么它在那里工作。
    • @Deduplicator 我不确定您所说的“符合标准的扩展”是什么意思。 C++ 标准需要诊断。 (当然,如果没有适当的选项,g++ 就不再是 C++ 编译器了。对于初学者,请尝试使用 -std=c++11。)
    • @JamesKanze:因为它不会改变任何有效代码的含义,并且使用适当的选项会导致警告,它是一个符合标准的扩展。虽然是的,但在那里遵守是多余的,而使用纯 C++(并让编译器强制执行该标准)可能会更好。
    • @Deduplicator 该标准要求您在编译代码时进行诊断。如果编译器没有生成一个,那么它不符合要求。 (但正如我所说,大多数编译器在没有特殊选项的情况下不符合。如果您使用正确的选项,G++ 是符合标准的。)
    【解决方案2】:

    对于数组,指定的大小必须是常数。所以虽然你可以这样做:

    Team s[10];
    

    你不能这样做:

    int size = 10;
    Team s[size];
    

    相反,您必须这样做:

    int size = 10;
    Team* s = new Team[size];
    // do stuff
    delete[] s;
    

    【讨论】:

    • 这是一个可怕的解决方案。唯一有效的解决方案是std::vector<Team> s(size)
    • 不是每个人都想使用向量。他问了一个问题,而正确的答案不是给出一个替代方案(不管你现在认为它好得多),而是回答所问的问题。
    • 这不是你想不想的问题:std::vector是这种情况下唯一正确的解决方案。
    【解决方案3】:

    在标准 C++ 中,数组的大小必须是编译时常量。 GCC 允许变长数组作为非标准扩展;其他编译器没有。

    要做到这一点,你需要动态分配数组:

    #include <memory>
    
    std::vector<Shape> s(atoi(argv[1]));
    

    【讨论】:

    • 什么时候扩展是标准扩展?谁都必须实施它?
    • @Deduplicator:我不知道你是什么意思;扩展不是标准的。你只是反对我使用多余的词来强调吗?
    猜你喜欢
    • 2014-02-22
    • 2018-10-21
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2018-06-05
    • 2020-01-22
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多