繁体   English   中英

需要有关宏定义的帮助

[英]Need help regarding macro definition

我正在阅读c ++代码,我已经找到了这样的定义

#define USE_VAL(X) if (&X-1) {}

有什么想法,这是什么意思?

根据名称,它看起来像是一种摆脱“未使用的变量”警告的方法。 预期用途可能是这样的:

int function(int i)
{
  USE_VAL(i)
  return 42;
}

如果没有这个,你可以得到一个编译器警告,在函数内部没有使用参数i

然而,这是一种相当危险的方法,因为它在代码中引入了未定义的行为(超出实际数组边界的指针算法是标准的Undefined)。 可以 1 添加到对象的地址,但不能减去1.当然,使用+ 1而不是- 1 ,编译器可以警告“条件始终为真”。 优化器可能会删除整个if并且代码仍然有效,但优化器在利用“未定义的行为不可能发生”方面正在变得更好,这实际上可能会非常意外地搞乱代码。

更不用说operator&所涉及的类型可能过载的事实,可能导致不希望的副作用。

有更好的方法来实现这样的功能,例如转换为void

#define USE_VAL(X) static_cast<void>(X)

但是,我个人的偏好是在函数定义中注释掉参数的名称,如下所示:

int function(int /*i*/)
{
  return 42;
}

这样做的好处是它实际上可以防止您在将参数传递给宏后意外使用该参数。

通常,这是为了避免“未使用的返回值”警告。 即使通常的“cast to void”习惯通常适用于未使用的函数参数,当忽略fread等函数的返回值时, gcc with -pedantic也特别严格(通常,标记为__attribute__((warn_unused_result))函数),所以一个“假的if ”经常被用来欺骗编译器认为你正在使用返回值做某事。

宏是一个预处理器指令,意味着无论在何处使用,它都将被相关的代码片段替换。

在USE_VAL(X)之后,它解释了USE_VAL(X)会做什么。

首先它取x的地址然后从中减去1。 如果是0那么什么也不做。

USE_VAL(X)将使用的地方将替换为if(&X-1){}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM