这段简单的代码
class S;
class G
{
void onRead(S & s)
{
(void)s;
}
};
在GCC上完美工作。使用(void)s
是避免警告"未使用变量’s’"的非常有用的方法。但是MSVC认为这是一个错误,停止编译。它给出了臭名昭著的错误C2027:使用未定义的类型's'。但是这里的"s"根本没用。
我不想使用void onRead(S &)
的形式,因为您无法在这个小片段示例中看到它,但在我的代码中,'s'的名称确实有意义,并且有助于理解参数。
有两种方法可以避免这个错误。
最直接的方法是将变量名转换为注释:
void onRead(S & /* s */)
另一种方法是使用宏删除变量:
#define UNUSED(x)
void onRead(S & UNUSED(s))
我相信你已经想到只是移动代码到一个点,S
是完全定义的,有一些原因你不能这样做。
不能使用"s",因为类"s"还没有完全定义。您可以:
1)使用#pragma warning(Disable:4100)禁用警告
2)将onRead
函数体移动到"S"已完全定义的位置
3)移动"S"的定义,使其位于onRead
(void*)&s;