【问题标题】:What is the meaning of such definition "#define __arch_swab32 __arch_swab32"? [duplicate]这样的定义“#define __arch_swab32 __arch_swab32”是什么意思? [复制]
【发布时间】:2017-08-24 09:12:05
【问题描述】:

在 /usr/include/asm/swab.h 我发现以下代码:

static __inline__  __u32 __arch_swab32(__u32 val)
{
    __asm__("bswapl %0" : "=r" (val) : "0" (val));
    return val;
}
#define __arch_swab32 __arch_swab32

最后一行是什么意思,将名字定义为自身?

【问题讨论】:

  • 耦合#ifdef?
  • 可能是为了防止其他代码在没有警告的情况下对其进行定义?
  • 为什么这个问题主要是基于意见的?
  • 可能有人不知道答案:)

标签: c linux


【解决方案1】:

这叫self-referentitial macro

自引用的一个常见且有用的用途是创建一个可扩展至自身的宏。如果你写

 #define EPERM EPERM

然后宏EPERM 扩展为EPERM。实际上,只要它用于运行文本,它就会被预处理器单独留下。你可以用#ifdef 来判断它是一个宏。如果您想使用 enum 定义数字常量,您可以这样做,但对于每个常量,#ifdef 都为真。

【讨论】:

  • 太棒了!在链接器阶段点击“未解析的符号”之前,您无法判断是否定义了函数。使用 ifdef 你可以马上知道!
  • @Jean-FrançoisFabre;是的。我正在添加另一个示例来进一步解释它。
  • 不过,不要让你的答案过多。有时短是好的。我预测你会像这样获得很多支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2021-12-25
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多