什么是`(void)varName;`做

What does `(void)varName;` do?

本文关键字:varName void 什么      更新时间:2023-10-16

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

在下载并使用CMake构建GDCM代码后,我偶然发现了以下内容:

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

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

它防止未使用的变量警告。假设宏gdcmErrorMacro()可以是作为空宏的#defined,并且在这种情况下msg将不被引用。

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

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

这也可以通过一开始不命名正式参数来解决——事实上,如果在使用宏时没有提到msg,我会这样做IRL:

void error_callback(const char *, void *) {
}

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

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

edit:实际上,函数使用该参数,但可以设置宏gdcmErrorMacro(通过编译定义的宏(以扩展到…nothing(例如,按照Linux内核中的惯例,扩展到空的do{}while(0);结构(。

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

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

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

而参数CCD_ 11的唯一"使用"将是该行CCD_。