可能重复:
casting unused return values to void
C++ What is the purpose of casting to void?
使用CMake下载并构建GDCM代码后,我偶然发现了这个问题:
void error_callback(const char *msg, void *) {
(void)msg;
gdcmErrorMacro( "Error in gdcmopenjpeg" << msg );
}
第一行有什么作用?从来没有见过这样的东西。请记住,如果重要的话,我告诉CMake使用Visual Studio 2010进行构建。
答案 0 :(得分:9)
它会阻止未使用的变量警告。据推测,宏gdcmErrorMacro()
可以#define
为空宏,msg
在这种情况下不会被引用。
答案 1 :(得分:3)
这可以防止在函数中未使用函数的形式参数时发出编译器警告。
编译生产代码并将警告视为错误通常是个好主意,因此这似乎是在宏使用中引用msg
之前尝试清除它。
这也可以通过简单地不首先命名一个形式参数来处理 - 实际上,如果在使用宏时没有提到msg
,那就是我做的IRL:
void error_callback(const char *, void *) {
}
答案 2 :(得分:2)
该函数不使用参数msg
,编译器会抱怨(警告)未使用的参数。
(void)msg;
行只是“使用”该参数(没有效果)。这样,编译器就不会生成警告。
编辑:实际上,该函数使用该参数,但宏gdcmErrorMacro
可以设置(通过编译定义的宏)扩展为...... nothing(例如,空{{1}构造,就像Linux内核中的习惯一样。
这样,编译器在使用参数do{}while(0);
的函数体中看不到任何内容(请记住编译器会看到预处理的源文件,因此宏是已经扩大了。)
在这种情况下,在预处理之后,编译器将看到:
msg
且参数void error_callback(const char *msg, void *) {
(void)msg;
do{ }while(0);
}
的唯一“用途”就是该行msg
。