在Ubuntu Linux20.04机器上的/usr/include/x86_64-linux-gnu/bits/resource.h中,我看到如下代码:

enum __rusage_who
{
  /* The calling process.  */
  RUSAGE_SELF = 0,
#define RUSAGE_SELF RUSAGE_SELF

  /* All of its terminated child processes.  */
  RUSAGE_CHILDREN = -1
#define RUSAGE_CHILDREN RUSAGE_CHILDREN
};

我们看到,RUSAGE_SELF被定义为它自己.它的目的/好处是什么?

enter image description here

推荐答案

在同一文件的注释中解释了这一点.

/* Transmute defines to enumerations.  The macro re-definitions are
   necessary because some programs want to test for operating system
   features with #ifdef RUSAGE_SELF.  In ISO C the reflexive
   definition is a no-op.  */

因此,它们只用于#ifdef个版本的功能测试.

您还希望它们能够实际用作(编译时)整型常量表达式.所以#define RUSAGE_SELF不起作用,你必须做#define RUSAGE_SELF RUSAGE_SELF.

上述 comments 的第一句话表明,它很可能最初只是 #define RUSAGE_SELF 0. 事实上,例如this link包含行#define RUSAGE_SELF 0.

然而,尽管基于边缘观点,但由于各种原因,将整型常量定义为宏不如使用枚举.有关详细信息,请参阅this question.因为它们可以是宏(无论是在历史版本中还是在类似系统上的类似头中),所以有人使用#ifdef测试它们是完全有意义的,在他们决定进行转换并将其重写为枚举后,他们需要确保这些遗留代码不会因为更改而被 destruct .

C++相关问答推荐

漏洞仅出现在FreeBSD上,但在Windows、Linux和MacOS上运行得非常好

有什么方法可以检测SunOS上的SparcWorks吗?

修改pGM使用指针填充2-D数组但不起作用

设计处理各种数据类型的方法和数据 struct

在函数中使用复合文字来初始化C语言中的变量

如何创建由符号组成的垂直结果图形?

将整数的.csv文件解析为C语言中的二维数组

C:fopen是如何实现二进制模式和文本模式的?

为什么内核使用扩展到前后相同的宏定义?

C语言编译阶段与翻译阶段的关系

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

用C语言计算文本文件中的整数个数

如何用c语言修改shadow文件hash部分(编程)?

通过描述符查找文件路径时出现问题

Caesar密码调试:输出文本末尾的问号和随机字符

为什么电路板被循环删除?

发送和接收的消息中的Unix域套接字不匹配

如何找出C中分配在堆上的数组的大小?

malloc 属性不带参数

将数组返回到链表