错误C2027: gcc vs msvc的情况



这段简单的代码

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

之前4)使用void指针:(void*)&s;

最新更新