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