为什么在宏中使用保留名称(以_开头)?

时间:2014-04-04 06:23:24

标签: c gcc standards identifier

以双下划线开头的标识符为reserved in C

那么为什么我在statement expressions内的Linux内核等代码中看到了很多这样的标识符?

例如,那是container_of宏:

#define container_of(ptr, type, member) ({ \
            const typeof( ((type *)0)->member ) *__mptr = (ptr); \
            (type *)( (char *)__mptr - offsetof(type,member) );})

为什么那里的临时值称为__mptr什么是保留名称?为什么不只是mptr

2 个答案:

答案 0 :(得分:3)

您的示例来自Linux内核。内核是一个特殊的程序。

它的许多头文件构成了操作系统用户空间SDK的一部分。因此,导出到用户空间的任何内核头文件都需要使用实现保留标识符来实现宏实现。

此外,由于内核不使用标准C库/运行时,它不会与标准C库头文件使用的保留标识符冲突(除了实际上是其中一部分的任何头文件)内核源代码本身)。

此外,内核源代码需要在知道许多编译器实现细节的情况下编写并正确编译和运行,因此作者可能知道编译器使用的保留标识符并且能够避免与它们发生冲突。

由于这些原因,简单地编写所有内核宏(无论它们是否导出到用户空间)在内部仅使用保留标识符可能是最简单的策略。

答案 1 :(得分:1)

宏的参数名称不应与用户标识符冲突,否则宏将无法正常运行。

C中的保留标识符保留用于“实现”使用。因此,允许编译器,运行时库等 使用它们。人们通常将“实施”一词用来表示一般的系统。操作系统是系统的一部分。因此,查看系统标头中使用的保留标识符是类似的。