这个陈述有什么作用?

时间:2012-12-27 15:35:43

标签: c++ visual-studio-2010 syntax

  

可能重复:
  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进行构建。

3 个答案:

答案 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