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

Visual C++编译器选项

  •  0
  • Programmer  · 技术社区  · 6 年前

    我需要确保当发生隐式转换时,编译器应该抛出警告/错误,如下代码所示:

    int32_t y = 9;
    uint32_t x = y;
    y = -1;
    x = y;
    

    在gcc中,我可以使用 -Wconversion-Wsign转换 编译器标记一起报告这样的问题-是否有类似的VC++构建选项?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Chuck Walbourn    6 年前

    看见 Compiler Warnings That Are Off by Default

    • C4287(级别3)“运算符”:无符号/负常量不匹配

    • C4365(级别4)“操作”:从“type\u 1”转换为“type\u 2”,有符号/无符号不匹配

    • C4388(级别4)有符号/无符号不匹配

    • C4287(级别3)“运算符”:无符号/负常量不匹配

    还有其他一些与截断有关。

    通常,您可以通过打开所有警告来使用这些 /Wall 然后根据您的代码建立一个抑制列表,因为很多抑制都非常嘈杂。

    例如,在 DirectX Tool Kit for DX11 ,我使用 /墙壁 在我的 pch.h :

    // VS 2013 related Off by default warnings
    #pragma warning(disable : 4619 4616 4350 4351 4472 4640 5038)
    // C4619/4616 #pragma warning warnings
    // C4350 behavior change
    // C4351 behavior change; warning removed in later versions
    // C4472 'X' is a native enum: add an access specifier (private/public) to declare a WinRT enum
    // C4640 construction of local static object is not thread-safe
    // C5038 can't use strictly correct initialization order due to Dev12 initialization limitations
    
    // Off by default warnings
    #pragma warning(disable : 4061 4265 4365 4571 4623 4625 4626 4628 4668 4710 4711 4746 4774 4820 4987 5026 5027 5031 5032 5039)
    // C4061 enumerator 'X' in switch of enum 'X' is not explicitly handled by a case label
    // C4265 class has virtual functions, but destructor is not virtual
    // C4365 signed/unsigned mismatch
    // C4571 behavior change
    // C4623 default constructor was implicitly defined as deleted
    // C4625 copy constructor was implicitly defined as deleted
    // C4626 assignment operator was implicitly defined as deleted
    // C4628 digraphs not supported
    // C4668 not defined as a preprocessor macro
    // C4710 function not inlined
    // C4711 selected for automatic inline expansion
    // C4746 volatile access of '<expression>' is subject to /volatile:<iso|ms> setting
    // C4774 format string expected in argument 3 is not a string literal
    // C4820 padding added after data member
    // C4987 nonstandard extension used
    // C5026 move constructor was implicitly defined as deleted
    // C5027 move assignment operator was implicitly defined as deleted
    // C5031/5032 push/pop mismatches in windows headers
    // C5039 pointer or reference to potentially throwing function passed to extern C function under - EHc
    
    // Windows 8.1 SDK related Off by default warnings
    #pragma warning(disable : 4471 4917 4986 5029)
    // C4471 forward declaration of an unscoped enumeration must have an underlying type
    // C4917 a GUID can only be associated with a class, interface or namespace
    // C4986 exception specification does not match previous declaration
    // C5029 nonstandard extension used
    

    随着时间的推移,它确实需要维护成本来跟上编译器的变化,这就是为什么我有评论来提醒我每一个都是为了什么。