我的宏定义如下:
#define UNREF_PARAM_1(a)
do { \
(void)sizeof(a); \
} \
while (0)
摆脱编译器警告。在我正在开展的一个新项目中,VS2013突然再次抱怨一个未引用的形式参数。
奇怪的是,如果我只使用(void)param
,它确实有用。
有没有人知道为什么它与(void)sizeof(param)
一起使用时不起作用?
答案 0 :(得分:7)
因为在sizeof(param)
中,param
是一个所谓的未评估的操作数,因此不会使用 - 也就是说,在运行时不需要。
然而,(void)param
确实构成了一种使用方法。
代码内部带有符号的强制转换会调用static_cast
。 [expr.static.cast] / 6:
任何表达式都可以显式转换为类型 cv
void
in 在哪种情况下,它成为废弃值表达式(第5条)。
[EXPR] / 10:
在某些情况下,表达式仅出现其副作用。这种表达式称为丢弃值表达式。计算表达式并丢弃其值。 [...] 仅当表达式为volatile限定类型的左值时才应用左值到右值转换(4.1) [...]
[basic.def.odr] / 2:
表达式可能被评估,除非它是未评估的操作数(第5条)或其子表达式。一个名称显示为可能已评估的变量 表达式是 odr-used ,除非它是一个满足的对象 出现在常量表达式(5.19)和 将立即应用左值 - 右值转换(4.1)。
此引文的第一部分指出sizeof(a)
不是a
的使用,因为a
是未评估的操作数 1 。
显然(void)a
可能会被评估。并且因为a
当然既不允许出现在常量表达式中也不被声明为volatile
,所以不会立即应用左值到右值的转换"因此a
使用得很多。
1)这是一个表达式列表,其中x
是一个未评估的操作数,来自C ++ 11:
typeid(x)
,其中x
不是多态类类型的glvalue sizeof(x)
(和sizeof x
)noexcept(x)
decltype(x)
alignof(x)
? alignas(x)
?