什么是`(void)varName;`做
What does `(void)varName;` do?
可能重复:
将未使用的返回值强制转换为void
C++铸造空心的目的是什么?
在下载并使用CMake构建GDCM代码后,我偶然发现了以下内容:
void error_callback(const char *msg, void *) {
(void)msg;
gdcmErrorMacro( "Error in gdcmopenjpeg" << msg );
}
第一行是干什么的?从来没有见过这样的事。请记住,我告诉CMake使用VisualStudio2010进行构建,如果这很重要的话。
它防止未使用的变量警告。假设宏gdcmErrorMacro()
可以是作为空宏的#define
d,并且在这种情况下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_。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 如何将指针从一个void函数传递到另一个C++
- 为什么我在使用void函数时得到错误代码C2276
- void*到驱动程序中的UnicodeString
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 指针没有更新它在void函数内部指向的值
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 什么是`(void)varName;`做