需要有关宏定义的帮助
Need help regarding macro definition
在阅读c++代码时,我发现了这样的定义
#define USE_VAL(X) if (&X-1) {}
有人知道吗,这是什么意思?
根据名称,它看起来像是一种消除"未使用变量"警告的方法。预期用途可能是这样的:
int function(int i)
{
USE_VAL(i)
return 42;
}
如果没有这一点,您可能会得到一个编译器警告,称函数中未使用参数i
。
然而,这是一种相当危险的方法,因为它将Undefined Behavior引入到代码中(超出实际数组边界的指针算术是标准的Undefined)。可以将1添加到对象的地址,但不能减去1。当然,使用+ 1
而不是- 1
,编译器可以警告"条件始终为真"。优化器可能会删除整个if
,代码将保持有效,但优化器越来越善于利用"不可能发生未定义行为",这实际上可能会出乎意料地扰乱代码。
更不用说operator&
可能对所涉及的类型过载,这可能会导致不希望的副作用。
有更好的方法可以实现这样的功能,例如转换为void
:
#define USE_VAL(X) static_cast<void>(X)
然而,我个人倾向于在函数定义中注释掉参数的名称,如下所示:
int function(int /*i*/)
{
return 42;
}
这样做的好处是,它实际上可以防止在将参数传递给宏后意外使用该参数。
通常是为了避免出现"未使用的返回值"警告。即使通常的"强制转换为空"习惯用法通常适用于未使用的函数参数,gcc
和-pedantic
在忽略函数(如fread
)的返回值时也特别严格(通常是用__attribute__((warn_unused_result))
标记的函数),因此"伪if
"经常被用来欺骗编译器,使其认为你在用返回值做什么。
宏是一个预处理器指令,这意味着无论在哪里使用,它都将被相关的代码段所取代。
在USE_VAL(X)后面的空间解释了USE_VAL的作用
首先取x的地址,然后从中减去1。如果是0,则不执行任何操作。
其中USE_VAL(X)将被if(&X-1){}替换
- C++宏定义和取消定义
- 根据 c++ 标准在该宏定义中推送/弹出宏时的行为是什么
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 宏定义不正确没有错误
- Visual Studio:snprintf 冲突的宏定义
- 宏定义中的预处理器令牌两边有两个双引号
- CMake 添加和删除宏定义以编译共享库/可执行文件
- 宏C++#定义示例(对象)(::f(s,(对象),arg1,arg2,arg3)
- 根据模板参数选择宏定义
- 使用宏定义打印格式参数
- 组合宏定义以一次获得多个定义 [avr C++]
- 如何在可执行文件中查看宏定义值
- 是否有另一种方法可以在不使用宏定义的情况下进行此操作
- 如何理解宏定义
- 坚持理解以下宏定义
- 发布C++宏定义
- 通过生成文件预处理器宏定义在 c++ 中无法正常工作
- 将预处理器宏定义为宏定义线
- GCC是否支持宏定义中的多行原始字符串文字
- 需要有关宏定义的帮助