2

我在编写代码时发现了一些有趣的东西。我在我的代码中定义了一个宏,并且不小心将关键字int用作该宏的参数的变量名。代码工作得很好,但我有点惊讶。我读过 C 中的关键字是保留字,不能用作变量名。

这是我的代码:

#include <stdio.h>

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

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

谁能解释我为什么它工作正常?关键字是保留的,不能用作 C 中的变量名,或者这是 C 中宏的一些例外,这不是真的吗?

4

4 回答 4

6

在这种情况下,intis 不是一个变量(更正确:参数)名称,因为当然PRINT也不是一个函数——它是一个预处理器宏。

无论您作为宏定义的一部分编写的任何内容都只会被预处理器查看。到编译器看到已处理的源代码时,"int"名称就没有了。

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

于 2012-04-06T11:38:42.880 回答
4

#defineC 编译器看到它之前,它被预处理器替换。编译器本身看到的是这样的:

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

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

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

这不会编译。

于 2012-04-06T11:38:57.103 回答
3

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

于 2012-04-06T11:38:52.063 回答
1

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

关键字:自动中断案例之一 [...]

上述标记(区分大小写)保留(在翻译阶段 7 和 8 中)用作关键字,否则不得使用。

于 2012-04-06T11:46:14.173 回答