【问题标题】:C error with using else macro "expected parameter declarator"使用 else 宏“预期参数声明符”时出现 C 错误
【发布时间】:2020-07-24 03:27:17
【问题描述】:

我编写了以下 C 代码(根据 C99 标准)并且运行没有问题:

#include <stdio.h>

#ifdef _WIN32
printf("Running on Windows");
#endif

void test(int x);

int main() {
    return 0;
}

但是添加 else 导致了很多错误(大约 12 个)新代码有什么问题:

#ifdef _WIN32
printf("Running on Windows");
#else
printf("Running on Windows");
#endif

一些错误:

error: expected parameter declarator
expected ')'
warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
error: conflicting types for 'printf'

【问题讨论】:

  • 您不能在文件作用域中调用函数。 printf("..."); 需要在函数内部。
  • 您需要发布使用宏的上下文。正如@PSkocik 所说,这个宏需要在一个函数中,这样对 printf 的调用才能正确编译。
  • 我不明白为什么第一个代码可以工作?
  • @clark_smith 可能是因为_WIN32 没有定义,所以预处理器没有插入printf 调用。
  • 如果您使用像gcc/clang/tcc 这样的编译器,请使用-E 运行它以查看预处理后的文本输出。

标签: c if-statement error-handling macros c99


【解决方案1】:

当您使用条件编译时,预处理器会在编译步骤之前将代码添加到您的程序中。 因此,如果符号 _WIN32 存在,那么您实际上是在说

printf("Running on Windows");

void test(int x);

int main() {
    return 0;
}

这在语法上是不正确的,因为您在所有函数之外都有可执行代码(对 printf 的调用)。

如果您在添加 '#else' 之前没有遇到问题,那是因为符号 _WIN32 不存在并且预处理器没有将 printf 语句添加到您的代码中。

【讨论】:

  • 那么如果 _Win32 存在 #ifdef _WIN32 和 #endif 将被正确删除(并且只保留 printf () 调用)?但这是每次我运行程序时检查还是仅在预处理器阶段检查?
  • 是的,在预处理步骤
猜你喜欢
  • 2021-09-13
  • 1970-01-01
  • 2017-01-26
  • 2021-03-10
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多