我正在阅读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(X)
但是,我个人的偏好是在函数定义中注释掉参数的名称,如下所示:
int function(int /*i*/) { return 42; }
这样做的好处是它实际上可以防止您在将参数传递给宏后意外使用该参数.