【问题标题】:Using Constants to Set Array Size in C++在 C++ 中使用常量设置数组大小
【发布时间】:2014-03-18 02:38:29
【问题描述】:

我在这里看到了一个类似的问题,但答案似乎与我已有的相符。

#define POP_SIZE 10;
#define GENE_SIZE 24;

using namespace std;

int main()
{
    char population[POP_SIZE][GENE_SIZE];
    return 0;
}

编译器给了我错误“预期的']'”和“预期的表达式”。我正在使用 Xcode 5。可能是一个愚蠢的问题,但感谢您的帮助!

【问题讨论】:

  • preprocessing output(我去掉了using指令,因为你的代码中不存在std命名空间)。

标签: c++ arrays constants


【解决方案1】:

删除分号:

#define POP_SIZE 10
                   ^  // no semicolon
#define GENE_SIZE 24
                    ^ // no semicolon

using namespace std;

int main()
{
    char population[POP_SIZE][GENE_SIZE];
    return 0;
}

#define a b 指令具有这样的效果,即文本 b 会被替换为程序中每次出现的 a。这就是为什么它被扩展为

int main()
{
    char population[10;][24;];
    return 0;
}

这是一个错误。 Clang flag -E 可以添加到编译命令中以可视化扩展代码,即:

clang++ -E -std=c++1y -O3 -Wall -Wextra -pedantic-errors main.cpp && ./a.out

【讨论】:

  • 请您解释一下:(1)哪些分号,(2)为什么我们不应该以这样的形式结束这些行?
  • 谢谢大家,有道理,现在已经修复了:]
【解决方案2】:

正如 Lizusek 所说,只需从#define 中删除分号。宏 #define 只是文本。因此,当您在末尾添加分号时,编译器会将所有宏文本替换为您的常量和分号。

int main()
{
    char population[10;][24;];
    return 0;
}

这就是您收到编译错误的原因。

【讨论】:

    【解决方案3】:

    我有个更好的主意。 “const int POP_SIZE 10;”怎么样?和“const int GENE_SIZE 10;”?由于文本替换,还有许多其他情况会导致奇怪的编译器错误。总是更喜欢范围内的常量而不是 #define 语句。

    根据多年的经验,我不得不在大型项目中维护代码,但由于预处理器语句的使用不当,问题甚至更大。宏有用处,但实际上没有充分的理由来编写这样的常量。现在最好改掉这个习惯,而不是花几个小时研究毫无意义的编译器错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多