参见英文答案 > Why can’t an incomplete type be casted to void? 2个
下面是一个C头文件,在g和clang下编译时没有错误,但在MSVC2015下,它在(void)copyFrom行上出错,错误为C2027:使用未定义类型’blah :: SomeOtherClass’.
我的问题是:这个代码是否符合C标准?或者如果代码不正确(即因为将参数转换为(void)合法地需要的不仅仅是前向声明),那么在不引入不需要的参数copyFrom的情况下保留我的DOxygen文档以获取copyFrom参数的好方法是从未在我的编译器输出中引用警告? (注意,此时SomeOtherClass的完整定义不可用,因为SomeOtherClass依赖于DummyImplementation)
#ifndef blah_h
#define blah_h
namespace blah {
class SomeOtherClass;
/** Example of the problem at hand */
class DummyImplementation
{
public:
/** Dummy implemention of CopyFrom().
* @param copyFrom This parameter is ignored.
* @returns zero.
*/
int CopyFrom(const SomeOtherClass & copyFrom)
{
(void) copyFrom; // error C2027: use of undefined type 'blah::SomeOtherClass'
return 0;
}
};
} // end namespace blah
#endif
更新:Per Francois的请求,这是我的程序在使用MSVC 19.0.24210.0构建时使用的构建(不是关于C标准的要求的问题的答案应该取决于特定版本的MSVC的行为):
cl -c -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline /nologo /MP
/arch:SSE2 /Zi -O2 -MD -Zc:strictStrings -GR -W3 -w34100 -w34189 -w44996
-EHsc -D_WIN32_WINNT=0x0601 -DNDEBUG -D__WIN32__ -D_USE_MATH_DEFINES
-DQT_NO_CAST_ASCII -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
[... various -I flags omitted ...]
解决方法:
有关完整故事,请参阅this答案.
根据cppref,为(类型名称)表达(强调我的)
If
type-name
isvoid
, thenexpression
is evaluated for its side-effects and its returned value is discarded, same as whenexpression
is used on its own, as an expression statement.
也就是说,(void)copyFrom等同于copyFrom,它不起作用,并且不应要求C中的完整类型.
顺便说一下,您的代码可以在MSVC 2017(live)中编译好.
要禁止编译器警告,您可以考虑:
std::addressof(copyFrom)