如何让VS2015正确拒绝在类声明中使用类前缀?

pax*_*blo 10 c++ language-lawyer visual-studio-2015

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

int MyClass::Return42() const { return 42; }
Run Code Online (Sandbox Code Playgroud)

在我的标题中:

class MyClass {
public:
    int MyClass::Return42() const;
};
Run Code Online (Sandbox Code Playgroud)

现在我确定我之前已经完成了这项工作并让编译器痛苦地抱怨它是不允许的,需要删除标题中的类前缀.事实上,g++ 5.4.0无论我使用哪个ISO标准(11到17),使用单个文件(虽然-fpermissive会将其转换为警告而不是错误),在Linux下会抱怨它:

#include <iostream>

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

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

int main() {
    MyClass x;
    std::cout << x.Return42() << '\n';
}
Run Code Online (Sandbox Code Playgroud)

但我发现我全新安装的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',将来的版本中将删除该选项

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

所以我不相信这两者都是可行的解决方案.

use*_*999 6

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

然而,在VS2017中,您可以使用/permissive-开关,使编译器更符合标准(这也是一个提示,它不符合标准,但我无法在标准中找到合适的位置 - 也许有人可以填写它in),见这里.有了这个你得到了发出警告的警告:

error C4596: 'Return42': illegal qualified name in member declaration
Run Code Online (Sandbox Code Playgroud)

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

当我正确理解文档时,在VS2015中你可以使用/Ze开关(与之形成对比/permissive-),但是,当我正确使用编译器 - 资源管理器时,这仍然没有警告,请参阅此处.该/Ze开关还讨论在此SO问题.

编辑:

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