定义=时的预处理程序错误

时间:2013-08-23 15:56:14

标签: c c-preprocessor

我正在尝试一些尴尬的预处理,并想出了类似的东西:

#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 个答案:

答案 0 :(得分: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

的原因

答案 1 :(得分:5)

预处理器不在字符级别工作,它在令牌级别操作。因此,当它执行替换时,您将获得与以下内容相同的内容:

if (x = = 6)

而不是你想要的:

if (x==6)

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

答案 2 :(得分:4)

if(x=SIX) 

被解析为

if (x= =6).

所以你得到了错误。

答案 3 :(得分:0)

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

我怀疑你在x==6之间有空格。