首页 > 解决方案 > 如何让 VS2015 正确拒绝在类声明中使用类前缀?

问题描述

我最近从我的 cpp 文件中复制并粘贴了一个 C++ 成员函数到标题中,但忘记删除前缀。所以,在 cpp 文件中,我有类似的东西:

int MyClass::Return42() const { return 42; }

并且,在我的标题中:

class MyClass {
public:
    int MyClass::Return42() const;
};

现在我确定我之前已经这样做了,并且让编译器痛苦地抱怨它是不允许的,需要删除头文件中的类前缀。事实上g++ 5.4.0,无论我针对哪个 ISO 标准(11 到 17),在 Linux 下都会抱怨它,使用单个文件(尽管-fpermissive会将其变成警告而不是错误):

#include <iostream>

class MyClass {
public:
    int MyClass::Return42() const;
};

int MyClass::Return42() const { return 42; }

int main() {
    MyClass x;
    std::cout << x.Return42() << '\n';
}

但我发现我全新安装的 VsPro15 似乎允许这样做。

鉴于我希望我的代码可以跨不同平台移植,如何让 Visual Studio 拒绝此无效代码?


我知道建议的解决方案涉及/permissive-/Ze

首先,即使使用 VS2k15 Update 3,进入/permissive-Project properties | C/C++ | Command Line | Aditional Options字段也会导致:

2>cl : 命令行警告 D9002: 忽略未知选项 '/permissive-'

对于第二个,我看到:

2>cl:命令行警告 D9035:选项“Ze”已被弃用,将在未来版本中删除

但它无论如何都会编译错误的代码。

所以我不认为这两者都是可行的解决方案。

标签: c++visual-studio-2015language-lawyer

解决方案


据我所知,您将无法让 VS2015 对此发出警告。 本文档声明您需要/permissive-开关才能获得此特定警告。它还声明它应该包含在 VS2015 中。也许这是一个编译器错误?

然而,在 VS2017 中,您可以使用/permissive-开关,使编译器更符合标准(这也是一个提示,它不符合标准,但我在标准中找不到正确的位置——也许有人可以填充它中),请参见此处。有了这个,你会得到下面的警告:

error C4596: 'Return42': illegal qualified name in member declaration

/we4596也可以使用仅启用此警告而不是全部来自更标准的符合编译器的警告来触发您想要的警告。

当我正确理解文档时,VS2015 中您可以使用开关/Ze(与 这个SO question中也讨论了开关。/permissive-/Ze

编辑:

我发现说在编译器版本 19.00.24215.1 中引入了警告C4596。编译器资源管理器当前具有较旧的编译器(即19.00.24210),因此这可能是它无法正常工作的一个原因。


推荐阅读