可以将宏参数的名称作为关键字吗?

时间:2012-04-06 11:37:23

标签: c macros keyword

我在编写代码时发现了一些有趣的东西。我在我的代码中定义了一个宏,并意外地使用了关键字int作为该宏的参数的变量名。代码工作得非常好,但我对此感到有些惊讶。我已经读过,C关键字是保留字,不能用作变量名。

这是我的代码:

#include <stdio.h>

#define PRINT(int) printf("%d",int)

int main()
{
    int x=2;
    PRINT(x);
    return 0;
} 

任何人都可以解释我为什么工作正常?是不是保留关键字并且不能在C中用作变量名,或者这是C中的宏的一些例外吗?

4 个答案:

答案 0 :(得分:6)

在此上下文中,int不是变量(更正确:参数)名称,因为当然PRINT也不是函数 - 它是预处理器宏。

只要您在宏定义中编写的内容,只能由预处理器查看。当编译器看到已处理的源时,"int"名称仍然没有。

这类似于函数的形式参数所发生的情况:编译器可以看到这些名称,但是在完成源代码之后,它们的痕迹仍然保留在编译代码中(因此您需要在调试器中加载调试符号) “获取此信息”)。

答案 1 :(得分:4)

在C编译器看到它之前,#define被预处理器替换。编译器本身看到的是:

int main()
{
int x=2;
printf("%s",x);
return 0;
}

这是有效的C代码。使用关键字作为变量名确实会出错:

int main()
{
int float=2;
printf("%s",float);
return 0;
}

这不会编译。

答案 2 :(得分:2)

在预处理阶段,关键字不存在,只是被视为普通标识符。

答案 3 :(得分:1)

C标准第5.1.1.2节定义了C翻译的九个阶段。预处理阶段是4号;关键字仅在阶段7中被识别;在该阶段之前,所有关键字都被视为常规预处理令牌。有关详细信息,请参阅the standard

  

关键字:其中之一   自动休息案例[...]

     

保留上述令牌(区分大小写)(在翻译阶段7和8中)以供使用   关键字,不得以其他方式使用。