代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

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

  •  10
  • paxdiablo  · 技术社区  · 6 年前

    我最近将一个C++成员函数从我的CPP文件复制并粘贴到标题中,忘记删除前缀。所以,在cpp文件中,我得到了如下信息:

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

    在我的标题中:

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

    现在我 当然 我以前也这样做过,让编译器强烈抱怨不允许这样做,要求删除头中的类前缀。事实上 g++ 5.4.0 在Linux下抱怨它,不管哪个ISO标准I的目标(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 | C/C++ | Command Line | Aditional Options 字段,结果为:

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

    第二,我明白了:

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

    但它还是编译了错误的代码。

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

    3 回复  |  直到 6 年前
        1
  •  6
  •   user32434999    6 年前

    据我所知,你会的 无法使VS2015对此发出警告。 This document 声明您需要 /permissive- 切换以获取此特定警告。它还指出,应将其纳入VS2015。也许这是一个编译器错误?

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

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

    您想要的警告也可以使用 /we4596 只启用此警告,而不是来自更标准的一致编译器。

    当我正确理解文档时,在VS2015中可以使用 /Ze 开关(与 /宽容的- )但是,当我正确使用编译器资源管理器时,仍然不会发出警告,请参见 here . 这个 /泽 还讨论了开关 in this SO question .

    编辑:

    我发现 this 上面说 警告C4596 在编译器版本中引入 19.00.24215.1年 . 编译器资源管理器当前具有较旧的编译器(即。 19.00.24210号 ),所以这可能是它不起作用的原因。

        2
  •  2
  •   abdulrhmanOmran    6 年前

    在以下文章中查找C4596:

    https://blogs.msdn.microsoft.com/vcblog/2016/11/16/permissive-switch/

    //Use of qualified names in member declarations
    
    
    struct A {
        void A::f() { } // error C4596: illegal qualified name in member declaration
                        // remove redundant 'A::' to fix
    };
    
        3
  •  0
  •   sandthorn    6 年前

    警告级别 documentation

    /我们 nnnn:将nnnn指定的编译器警告视为错误。

    所以根据上面@p-i的评论,作为警告 C4596 ,添加参数 /we4596 做的诀窍 then .

    <source>(5): error C4596: 'Return42': illegal qualified name in member declaration
    Compiler returned: 2
    

    添加时 /w14596 只是警告,如果你 prefered .

    <source>(5): warning C4596: 'Return42': illegal qualified name in member declaration
    Compiler returned: 0
    

    以下是@p-i的评论 VS2017年++ 只有。