强制编译器为C99标准
当我发现我使用了一段时间的匿名结构实际上只在C11中可用,而不是C99时,我正在对我的项目进行编码,这是我想要编写的标准。
给出以下代码:
struct data {
int a;
struct {
int b;
int c;
};
};
int main()
{
struct data d;
d.a = 0;
d.b = 1;
d.c = 2;
return 0;
}
此代码只应在C11中编译(或者如果编译器扩展提供此功能并且已启用)。 所以让我们看看不同编译器的结果:
铛5
compiler:
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
command:
clang -std=c99 -Wall test.c -o test
result:
**OK**
gcc 4.1
compiler:
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
command:
gcc -std=c99 -Wall test.c -o test
result:
**NOT OK**
test.c:6: warning: declaration does not declare anything
test.c: In function 'main':
test.c:14: error: 'struct data' has no member named 'b'
test.c:15: error: 'struct data' has no member named 'c'
gcc 4.7
compiler:
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
command:
gcc -std=c99 -Wall test.c -o test
result:
**OK**
test.c: In function 'main':
test.c:11:14: warning: variable 'd' set but not used [-Wunused-but-set-variable]
我一直试图通过指定-std=c99
来强制编译器进入C99模式,但显然这是行不通的(除非gcc 4.1编译良好而没有-std参数)。 所以我的问题是,如果我编写的代码不符合我使用-std
指定的标准,我怎么能强制编译器gcc和clang在任何版本中发出错误? 有一些我不知道的命令行参数吗?
-std=c99
不会禁用语言扩展(GNU C在C99中有匿名结构)。
这个-pedantic
(or -pedantic-errors
)标志使编译器警告语言扩展。
gcc
和clang
允许大量的扩展,并且在这里用于叮当声。 clang
一般会试图支持gcc
所做的大部分扩展。 两者甚至会允许您使用C ++中的功能,例如C ++功能的VLA。
在这种情况下,它们都允许您在C99模式下使用结构体/联合体中的未命名结构/联合字段,即使它是C11功能。
海湾合作委员会支持的语言标准很好地记录了将这些语言转化为警告和错误所需的标志,据我所知, clang
遵循相同的惯例:
要获得标准所需的所有诊断信息,您还应该指定-pedantic(或-pedantic-errors,如果您希望它们是错误而不是警告)。 [...]
所以-pedantic
如果您正在使用的扩展,将发出警告-pedantic-errors
将会把这些警告到错误。 用-pedantic
标志,你应该在gcc
看到这样的警告:
警告:ISO C99不支持未命名的结构体/联合体[-Wpedantic]
这在clang
(看到它住):
警告:匿名结构是C11扩展[-Wc11-extensions]
并且它变成了带有-pedantic-errors
。
上一篇: Forcing compiler to C99 standard
下一篇: How much does the GCC compilers keep to the C/C++ standards?