定义一个C宏为自身的目的是什么?(在glibc头文件中看到)

6yoyoihd  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(89)

在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
};

字符串
我们看到RUSAGE_SELF被定义为自身,它的目的/好处是什么?
x1c 0d1x的数据

x3naxklr

x3naxklr1#

这在同一文件的评论中有解释。

/* 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
上面注解的第一句话表明它很可能最初只是#define RUSAGE_SELF 0。实际上,例如this link包含行#define RUSAGE_SELF 0
然而,尽管边界基于观点,但由于各种原因,将整数常量定义为宏不如使用枚举。有关详细信息,请参阅this question。(无论是在历史版本中还是在类似系统上的类似头文件中),有人会使用#ifdef测试它们是完全有道理的,在他们决定进行转换并将它们重写为枚举之后,他们需要确保这些遗留代码不会被更改破坏。

相关问题