Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在宏中使用保留名称(以_开头)?_C_Gcc_Standards_Identifier - Fatal编程技术网

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

C 为什么在宏中使用保留名称(以_开头)?,c,gcc,standards,identifier,C,Gcc,Standards,Identifier,以双下划线开头的标识符为 那么,为什么我在代码中经常看到像Linux内核这样的标识符呢 例如,这是宏的容器_: 定义PTR、类型、成员{\ 常量类型*0->member*u mptr=ptr\ type*char*\uu mptr-offsetoftype,member;} 为什么那里的临时值叫做u\mptr?什么是保留名称?为什么不只是mptr?宏的参数名称不应该与用户标识符冲突,否则宏将无法正常工作 C中的保留标识符是为实现使用而保留的。因此,编译器、运行时库等都可以使用它们。人们通常认为“

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

那么,为什么我在代码中经常看到像Linux内核这样的标识符呢

例如,这是宏的容器_:

定义PTR、类型、成员{\ 常量类型*0->member*u mptr=ptr\ type*char*\uu mptr-offsetoftype,member;}
为什么那里的临时值叫做u\mptr?什么是保留名称?为什么不只是mptr?

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


C中的保留标识符是为实现使用而保留的。因此,编译器、运行时库等都可以使用它们。人们通常认为“实现”一词是指系统。操作系统是系统的一部分。因此,在系统头和类似文件中使用保留标识符是正常的。

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


C中的保留标识符是为实现使用而保留的。因此,编译器、运行时库等都可以使用它们。人们通常认为“实现”一词是指系统。操作系统是系统的一部分。因此,在系统头和类似文件中使用保留标识符是正常的。

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

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

此外,由于内核无论如何都不使用标准C库/运行时,因此它不会与标准C库头文件使用的保留标识符发生冲突,但实际上是内核源代码本身一部分的头文件除外

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


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

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

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

此外,由于内核无论如何都不使用标准C库/运行时,因此它不会与标准C库头文件使用的保留标识符发生冲突,但实际上是内核源代码本身一部分的头文件除外

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


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

这意味着我仍然不应该在宏中为自己的代码使用双下划线,对吗?不过,操作系统使用的标识符如何可能与用户代码冲突?我通常不包括Linux源代码;是的,你不应该。您可能没有包含它们,但是您包含的标准库标题可能会包含它们。这意味着我仍然不应该在宏中为自己的代码使用双下划线,对吗?不过,操作系统使用的标识符如何可能与用户代码冲突?我通常不包括Linux源代码;是的,你不应该。您可能没有包含它们,但您确实包含的标准库标题可能会包含它们。