13

我正在尝试一些尴尬的预处理并想出了这样的事情:

#include <stdio.h>

#define SIX =6

int main(void)
{
  int x=6;
  int y=2;

  if(x=SIX)
    printf("X == 6\n");
  if(y=SIX)
    printf("Y==6\n");

  return 0;
}

gcc 给了我错误:

test.c:在函数'main'中:
test.c:10:8:错误:'='标记之前的预期表达式
test.c:12:8:错误:'='标记之前的预期表达式

这是为什么?

4

4 回答 4

15

==是一个单一的令牌,它不能被分成两半。你应该gcc -E在你的代码上运行

从 GCC 手册页:

-E预处理阶段后停止;不要正确运行编译器。输出采用预处理源代码的形式,发送到标准输出。

不需要预处理的输入文件将被忽略。

对于您的代码gcc -E,给出以下输出

  if(x= =6)
    printf("X == 6\n");

  if(y= =6)
    printf("Y==6\n");

第二个=是什么导致错误信息expected expression before ‘=’ token

于 2013-08-23T15:59:47.130 回答
5

预处理器不在字符级别工作,它在令牌级别运行。因此,当它执行替换时,您会得到相当于:

if (x = = 6)

而不是你想要的:

if (x==6)

对此有一些特定的例外,例如#字符串化运算符。

于 2013-08-23T16:01:16.027 回答
4
if(x=SIX) 

被解析为

if (x= =6).

所以你得到了错误。

于 2013-08-23T16:05:05.153 回答
0

你用的是什么工具链?如果您使用的是 GCC,您可以添加-save-temps选项并检查test.i中间结果以解决您的问题。

我怀疑你在x=和之间有一个空格=6

于 2013-08-23T16:02:57.627 回答