如何指定gcc中的{} init不能编译?

时间:2017-08-16 15:54:23

标签: c gcc c99

使用gcc使用-std=gnu99,以下代码编译:

void f()
{
  struct X data = {};
  // do something with data
}

这是有效的C吗? 这是一个gnu扩展吗?

我怎么能告诉gcc不接受这种初始化?

我想确保与其他编译器的兼容性(例如visual 2015)

3 个答案:

答案 0 :(得分:3)

不,空的初始化程序不是标准C.它是gcc扩展名。 See this有详细说明。

通过指定-std=gnu99,您可以使用GNU扩展。您可以通过指定-std=cXX选项强制编译器仅允许标准符合代码。

来自gcc online manual强调我的

  

-std=

     

编译器可以接受几个基本标准,例如'c90'或'c ++ 98',以及这些标准的GNU方言,例如'gnu90'或'gnu ++ 98'。 当指定基本标准时,编译器接受遵循该标准的所有程序以及使用与其不相矛盾的GNU扩展的程序。例如,-std = c90关闭与GCC不兼容的某些GCC功能ISO C90,例如asm和typeof关键字,但没有其他在ISO C90中没有意义的GNU扩展,例如省略?:表达式的中间项。另一方面,当指定标准的GNU方言时,即使这些功能改变了基本标准的含义,也会启用编译器支持的所有功能。因此,有些严格 - 符合规定的计划可能会被拒绝。 -Wpedantic使用特定标准来识别给定该标准版本的GNU扩展的哪些特征。例如-std = gnu90 -Wpedantic警告C ++样式'//'注释,而-std = gnu99 -Wpedantic则没有。

答案 1 :(得分:3)

-pedantic选项会在这种情况下显示警告,而-Werror会导致所有警告都被视为错误。

例如:

x1.c: In function ‘f’:
x1.c:11:19: error: ISO C forbids empty initializer braces [-Werror=pedantic]
   struct X data = {};

答案 2 :(得分:3)

如果您要拒绝包含特定于GNU的扩展程序的代码,请使用-std=c99 -pedantic-errors-pedantic将针对非标准扩展程序发出诊断信息,但它不会完全拒绝该代码)。但是,如果您想保证ISO一致性,请注意这不是100%的解决方案。从gcc手册页:

  

有些用户尝试使用-pedantic检查程序是否符合严格的ISO C标准。他们很快发现它没有做到他们想要的东西:它找到了一些非ISO实践,但不是全部 - 只有ISO C需要诊断的那些,以及其他一些已经添加了诊断的实践。

     

报告任何不符合ISO C的功能在某些情况下可能会有用,但需要大量额外工作,并且与-pedantic完全不同。我们没有计划在不久的将来支持这样的功能。