下面是一段代码:
void test(int var) { Q_UNUSED(var); #ifdef SOMETHING printf("%d",var); //do something else with var... #endif }
如果我在某些情况下实际使用'var'变量(如上面的示例),Q_UNUSED宏会有任何效果吗?或者当我抑制未使用变量的编译器警告时,它根本没有效果?到目前为止,我观察到它没有效果,但我想确定一下。
Q_UNUSED
dgtucam11#
在许多情况下(如只是传递一个简单的变量给宏)。定义在qglobal.h内部:
qglobal.h
# define Q_UNUSED(x) (void)x;
禁用 * 未使用的变量 * 警告。您可以在此宏之后使用变量,没有任何问题。但是,如果你传递一个表达式或其他东西给宏,编译器必须计算这个表达式,它可能会有副作用†。
zyfwsgd62#
应该没有副作用,但在MSVC上,它有时会产生无用的memcpy指令。最简单的例子是volatile。可能还有其他人:https://developercommunity.visualstudio.com/t/visual-c-generates-terrible-code-when-struct-conta/650789
volatile
kyks70gy3#
这是Qt通过将警告作为表达式的一部分来抑制警告的方法,而不会产生任何效果。有点。旧的编译器有不可移植的方法来标记参数未使用或不可移植的方法来暂时抑制警告。在其他一些最新的编译器会生成一个关于语句的诊断消息,该语句什么也不做。现代C++有一个alternative。但是,如果在头文件中使用,它可能会扰乱元对象编译器。
3条答案
按热度按时间dgtucam11#
在许多情况下(如只是传递一个简单的变量给宏)。定义在
qglobal.h
内部:禁用 * 未使用的变量 * 警告。您可以在此宏之后使用变量,没有任何问题。
但是,如果你传递一个表达式或其他东西给宏,编译器必须计算这个表达式,它可能会有副作用†。
zyfwsgd62#
应该没有副作用,但在MSVC上,它有时会产生无用的memcpy指令。最简单的例子是
volatile
。可能还有其他人:https://developercommunity.visualstudio.com/t/visual-c-generates-terrible-code-when-struct-conta/650789kyks70gy3#
这是Qt通过将警告作为表达式的一部分来抑制警告的方法,而不会产生任何效果。有点。旧的编译器有不可移植的方法来标记参数未使用或不可移植的方法来暂时抑制警告。在其他一些最新的编译器会生成一个关于语句的诊断消息,该语句什么也不做。
现代C++有一个alternative。但是,如果在头文件中使用,它可能会扰乱元对象编译器。