在 Ubuntu Linux 20.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
};
Run Code Online (Sandbox Code Playgroud)
我们看到它RUSAGE_SELF被定义为它本身。其目的/好处是什么?
这在同一文件的注释中进行了解释。
/* 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. */
Run Code Online (Sandbox Code Playgroud)
所以它们只是为了功能测试而#ifdef工作。
您还希望它们实际上可以用作(编译时)整型常量表达式。所以#define RUSAGE_SELF不行,你必须这样做#define RUSAGE_SELF RUSAGE_SELF。
上述评论的第一句话表明它很可能最初只是
#define RUSAGE_SELF 0。事实上,例如此链接包含行#define RUSAGE_SELF 0.
然而,尽管基于观点,但由于各种原因,将整型常量定义为宏不如使用枚举。有关详细信息,请参阅此问题。由于它们需要是用于功能测试的宏#ifdef,并且在决定进行转换并将它们重写为枚举之后,他们需要确保这些代码不会因更改而损坏。
从getrusage(2) 的手册页中,我可以想象有人可能会编写以下代码以便可移植,
#ifdef RUSAGE_THREAD
if(getrusage(RUSAGE_THREAD, usage)==0){
//Do something
}
else{
//Error handling
}
#endif
Run Code Online (Sandbox Code Playgroud)
这是必要的,因为RUSAGE_THREAD仅在 Linux >= 2.6.26 中可用。可以使上述编译的唯一两个选择是
#define RUSAGE_THREAD 1
Run Code Online (Sandbox Code Playgroud)
和
enum __rusage_who{
//...
RUSAGE_THREAD = 1;
#define RUSAGE_THREAD RUSAGE_THREAD
};
Run Code Online (Sandbox Code Playgroud)
由于已决定使用后者,为了保持一致性,对其他常量(包括RUSAGE_SELF和 )执行相同操作是有意义的RUSAGE_CHILDREN,尽管这两个常量在 POSIX 下保证有效。