gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:06:08 27 4
gpt4 key购买 nike

我最近将我的 cpp 文件中的 C++ 成员函数复制并粘贴到 header 中,但忘记删除前缀。所以,在 cpp 文件中,我有类似的内容:

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

并且,在我的标题中:

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

现在我确定我以前做过那件事,编译器提示说不允许这样做,要求删除 header 中的类前缀。事实上,g++ 5.4.0 在 Linux 下提示它,无论我针对哪个 ISO 标准(11 到 17),使用单个文件(尽管 -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 拒绝这个无效代码?


我知道 suggested solutions涉及 /permissive-/Ze

首先,即使使用 VS2k15 Update 3,在 Project properties | 中输入 /permissive- C/C++ |命令行 |附加选项 字段,结果为:

2>cl : Command line warning D9002: ignoring unknown option '/permissive-'

第二个,我看到:

2>cl : Command line warning D9035: option 'Ze' has been deprecated and will be removed in a future release

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

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

最佳答案

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

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

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

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

当我正确理解文档时,在 VS2015 中你可以使用 /Ze 开关(相对于 /permissive-),但是,当我使用编译器时 -资源管理器正确,这仍然没有警告,请参阅 here .还讨论了 /Ze 开关 in this SO question .

编辑:

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

关于c++ - 如何让 VS2015 正确地拒绝在类声明中使用类前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51721796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com