使用gcc使用-std=gnu99
,以下代码编译:
void f()
{
struct X data = {};
// do something with data
}
这是有效的C吗? 这是一个gnu扩展吗?
我怎么能告诉gcc不接受这种初始化?
我想确保与其他编译器的兼容性(例如visual 2015)
答案 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
完全不同。我们没有计划在不久的将来支持这样的功能。