小编mic*_*190的帖子

如何在 CMakeLists.txt 文件中的第三方库头文件中抑制 Clang 警告?

我目前正在尝试使用 Visual Studio 2019 的新 CMake 功能(特别是将 Clang 和 Ninja 与 CMake 和 VS2019 结合使用)来设置一个项目,该项目将使用多个编译器(包括 Clang、MSVC 和 GCC)。

我正在使用 CMake 将项目配置为“与编译器无关”,这样我就不需要编辑代码本身来通过预处理器指令或#pragma指令处理不同的编译器

这个项目需要进行配置,以具有较高的警告级别(/W4对于MSVC, ,-Wall-Wextra-Wpedantic为锵),并且必须将警告视为错误。

在配置项目的 MSVC 部分时,我没有任何问题。很多这些设置都有“正常”的默认值,正如我所期望的那样“正常工作”。但是,当涉及到 Clang 时,我遇到了一个问题:

我似乎无法禁用第三方库头文件的警告。我目前正在使用Dear ImguiSFML库。由于 Dear Imgui 未预编译,因此我只需在我的CMakeLists.txt文件中执行以下操作即可将其包含在内:

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/libs/imgui
)
Run Code Online (Sandbox Code Playgroud)

我使用 SFML 的静态链接版本,因此我执行以下操作以包含它:

# Find SFML and link statically to it.
# Note: We need to set the SFML_DIR variable manually.
set(SFML_STATIC_LIBRARIES TRUE)
set(SFML_DIR …
Run Code Online (Sandbox Code Playgroud)

c++ cmake clang suppress-warnings

10
推荐指数
1
解决办法
4144
查看次数

C ++:即使使用“ this”关键字,参数声明也会隐藏类成员

我最近开始使用“警告级别4”并将C ++编码时的警告视为错误。我想要一些有关以下代码段的更深入的信息:

struct Foo
{
    Foo(int size)
        //:size{ size } // <- More on this later.
    {
        this->size = size;
    }

    void func(int size)
    {
        this->size = size;
    }

    int size;
};

int main()
{
    Foo a{ 1 };
    a.func(2);
}
Run Code Online (Sandbox Code Playgroud)

因此,我从Visual Studio 2019中收到以下警告/错误:

错误:C2220-警告被视为错误-未生成任何“对象”文件。

警告:C4458-'size'声明隐藏了类成员。

该警告表示该size成员正在被也称为的方法的参数隐藏size。输出表明错误不是来自构造函数,而是来自func方法。我觉得这很令人困惑,因为构造函数似乎没有这个问题(实际上,删除func允许片段进行编译)。

降低警告级别可以使应用程序编译,并且看起来可以按预期运行。使用初始化程序列表而不是构造函数的主体(请参见注释行)似乎也可以工作,但是我猜测这是由于初始化程序列表语义所致。

我了解到该错误表明size参数名称funcFoo的同名成员冲突,但是this关键字不应该解决这种混淆吗?这仅仅是微软的编译器过于严格吗?

c++ this compiler-warnings shadowing visual-c++

5
推荐指数
1
解决办法
805
查看次数