0

可能重复:
将未使用的返回值转换为 void
C++ 转换为 void 的目的是什么?

在使用 CMake 下载并构建GDCM代码后,我偶然发现了这一点:

void error_callback(const char *msg, void *) {
    (void)msg;
    gdcmErrorMacro( "Error in gdcmopenjpeg" << msg );
}

第一行是做什么的?从来没有见过这样的事情。请记住,如果这很重要,我告诉 CMake 使用 Visual Studio 2010 进行构建。

4

3 回答 3

9

它可以防止未使用的变量警告。据推测,宏gdcmErrorMacro()可以#defined 作为空宏,msg在这种情况下不会被引用。

于 2012-12-27T15:38:57.023 回答
3

这可以防止在函数中未使用函数的形式参数时发出编译器警告。

编译生产代码并将警告视为错误通常是一个好主意,因此这看起来像是在尝试清除之前msg在宏使用中提到的问题。

msg这也可以通过简单地不首先命名形式参数来解决 - 事实上,如果没有提及使用宏时,这就是我要做的 IRL :

void error_callback(const char *, void *) {
}
于 2012-12-27T15:39:00.103 回答
2

该函数不使用该参数msg,编译器将抱怨(警告)未使用的参数。

(void)msg;行只是“使用”该参数(没有效果)。这样,编译器不会生成警告。

编辑:实际上,该函数使用该参数,但是gdcmErrorMacro可以(通过编译定义的宏)设置宏以扩展为...什么都没有(例如,do{}while(0);按照Linux内核的习惯,扩展为空结构。

这样,编译器将在使用参数的函数体中看不到任何内容msg(请记住,编译器看到的是预处理的源文件,因此宏已经展开)。

在这种情况下,在预处理之后,编译器将看到:

void error_callback(const char *msg, void *) {
    (void)msg;
    do{ }while(0);
}

并且参数的唯一“使用”msg是那一行(void)msg;

于 2012-12-27T15:39:36.870 回答