忽略 GCC“错误:标量初始化器类型的大括号”错误。让他们警告

Posted

技术标签:

【中文标题】忽略 GCC“错误:标量初始化器类型的大括号”错误。让他们警告【英文标题】:Ignoring GCC "error: braces around scalar initializer for type" errors. Make them warnings 【发布时间】:2014-03-14 21:19:56 【问题描述】:

我对 GCC 编译器错误“错误:类型的标量初始化程序大括号”有一个恼人的问题。我看到其他人对此有所抱怨,尽管他们将其描述为警告 (gcc warning: braces around scalar initializer)

我正在编译不是我要编辑的代码,我在整个代码中遇到了很多这样的错误。

基本模式是:

struct t_

    float f;
    int i;
;

float f =  0.3 ;      //Compiler is all happy with this.
int i = 0;            //Compiler is all happy with this too.
t_ t1 =  0.3, 0 ;     //Compiler is all happy with this too.
t_ t2 =  0.3, 0 ;   //Compiler ERROR: braces around scalar initializer for type 'float' 

我知道我可以删除浮动缩放器周围的大括号 以消除此错误,但我不想以任何方式修改代码。有没有我可以给 GCC 的标志(目前使用 MinGW gcc 4.8.1)。即“std=c++03”,或者让这些错误至少显示为警告的东西。

谢谢

【问题讨论】:

为什么要在标量初始化器周围放置大括号?看起来很奇怪。 这段代码以前在什么编译器上工作过? 根据语言语法,这不是语法错误; braced-init-list 可以是 initializer-clause, initializer-clause, ... ,而 initializer-clause 可以是 支撑初始化列表。有人能指出 t2 初始化是非法的吗? 代码最初是用 VxWorks Windriver Workbench 为嵌入式硬件编写和编译的。它现在正在通过 gcc 为 Linux 编译。 【参考方案1】:

我不是 100% 确定,但我相信没有这样的选择。在这两种情况下,您拥有的构造并不意味着相同的东西-第一种是一个结构的初始化,第二种是包含结构或数组的结构。 float 当然不是。

您也许可以使用

解决它
struct t_

    struct 
    
       float f;
    ;
    int i;
;

至少 clang 对此很满意。和 g++ 一样。这可能比更改许多带有额外大括号的初始化语句更容易。但不可否认,它仍然是对源代码的更改。不幸的是,我很确定这是必要的。

我正在测试的完整示例:

struct t_

    struct 
    
        float f;
    ;
    int i;
;



t_ t2 =  0.3, 0 ;


int main()

    t2.f = 7;

编辑: 如果根本无法编辑源代码,则需要解析源代码,识别不正确的大括号并输出“正确”代码。我对此想得越多,我就越不相信在不对源代码进行某种编辑的情况下修复它是完全可能的。或者它曾经编译过......

【讨论】:

感谢您的帮助。最终的解决方案是构建一个 Perl 脚本(预构建更新)来自动纠正这个和其他编译器问题(在 WindRiver Workbench 和 Linux GCC 之间)。不幸的是,我无法控制源代码(可重复的黑盒输入到我的系统)。如果 gcc 不符合语法会很感兴趣:braced-init-list

以上是关于忽略 GCC“错误:标量初始化器类型的大括号”错误。让他们警告的主要内容,如果未能解决你的问题,请参考以下文章

编译器处理警告错误 #pragma GCC diagnostic ignored "-Wunused"

GCC 标志忽略指令依赖

GCC 优化忽略循环条件

有没有办法告诉gcc忽略“”?

C++ 与 gcc 和 Visual Studio 不同的编译错误,“在此上下文中”

函数模板的部分属性在 GCC 中被静默忽略