在不使用#pragma的情况下,屏蔽一个特定的clang警告“缺少大括号”,前提是这条警告确实合理

编程语言 2026-07-09

我是在这段代码里触发了这个警告:

struct A {
    int x;
    int y;
};
struct B {
    int x;
    int y;
    int z;
};

struct Flatten {
    A a;
    B b;
};

int main() {
    [[maybe_unused]] Flatten arr{1, 2, 3, 4, 5};
}

现场

这个设计来自另一个问题,提问者想设计一个结构,以“扁平化”AB

使用单大括号对Flatten arr进行初始化,在我看来,这是合法的,但clang似乎更偏好Flatten arr{{1, 2}, {3, 4, 5}};,从而把子聚合的初始化显式化:

<source>:17:34: warning: suggest braces around initialization of subobject [-Wmissing-braces]
 17 |     [[maybe_unused]] Flatten arr{1, 2, 3, 4, 5};
    |                                  ^~~~
    |                                  {   }
<source>:17:40: warning: suggest braces around initialization of subobject [-Wmissing-braces]
 17 |     [[maybe_unused]] Flatten arr{1, 2, 3, 4, 5};
    |                                        ^~~~~~~
    |                                        {      }

我想不出有哪种情形这个警告是合理的,除了可读性。然而,我追求0个警告,那么有没有办法在这种特定情况下为clang关闭这个警告,而不影响对其他可能正当情况的屏蔽?

我更不想用#pragma来抑制警告:它不具可移植性,而且会让代码显得冗杂。我也许会考虑用一个接收初始化列表的创建函数来替代标准初始化吗?


注意:这不是与另外一个问题相关的提议的重复问题,那是与一个不同的问题相关,专门关于std::array初始化。

解决方案

你可以添加一个宏,在参数作用域内忽略这个警告:

#if defined(__GNUC__) || defined(__clang__)
#define IGNORE_MISSING_BRACES(...)                         \
    _Pragma("GCC diagnostic push")                         \
    _Pragma("GCC diagnostic ignored \"-Wmissing-braces\"") \
    __VA_ARGS__                                            \
    _Pragma("GCC diagnostic pop")
#else
#define IGNORE_MISSING_BRACES(...) __VA_ARGS__
#endif

struct A {
    int x;
    int y;
};
struct B {
    int x;
    int y;
    int z;
};

struct Flatten {
    A a;
    B b;
};

int main() {
    IGNORE_MISSING_BRACES([[maybe_unused]] Flatten arr{1, 2, 3, 4, 5};)
}

https://godbolt.org/z/jnY9qTM9z

关于gcc的提示,这个警告仅适用于C 和Objective-C代码(出于某种神秘的原因)。

警告选项(使用GNU编译器集合(GCC))

-Wmissing-braces(仅对C/ObjC)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章