C 如何使用-std=gnu99编译Linux内核模块?

C 如何使用-std=gnu99编译Linux内核模块?,c,linux,gcc,linux-kernel,c99,C,Linux,Gcc,Linux Kernel,C99,我最近学习了如何编写简单的字符驱动程序,在使用代码时,我注意到我的C99代码中出现了许多以下GCC警告: warning: ISO C90 forbids mixed declarations and code 我假设这是因为主Linux内核Makefile被设置为使用非C99标准编译。我四处搜索,在stackoverflow上找到了这个答案: 因此,我自然在Makefile中尝试了以下内容: ccflags-y := -std=gnu99 不幸的是,这并没有平息GCC的警告。我检查了mak

我最近学习了如何编写简单的字符驱动程序,在使用代码时,我注意到我的C99代码中出现了许多以下GCC警告:

warning: ISO C90 forbids mixed declarations and code
我假设这是因为主Linux内核Makefile被设置为使用非C99标准编译。我四处搜索,在stackoverflow上找到了这个答案:

因此,我自然在Makefile中尝试了以下内容:

ccflags-y := -std=gnu99
不幸的是,这并没有平息GCC的警告。我检查了
make
的详细输出,并验证了GCC确实是在末尾附加了
-std=gnu99
的情况下执行的;所以我有点困惑

如何使用
-std=gnu99
选项正确编译Linux内核模块

编辑


我注意到GCC输出显示了这个选项:
-Wdeclaration after语句
。这就是为什么即使使用
-std=gnu99
选项,我也会收到警告?

事实证明
-std=gnu99
确实有效;在删除编译器标志后,我开始看到关于C99特性的错误。这意味着除了
-std=
选项外,还有其他原因导致警告打印出来

通过
make V=1
解析详细输出后,我发现
-Wdeclaration After语句
选项是GCC执行的一部分。这就是我看到的ISO C90混合声明警告的原因

要禁用ISO C90警告,请将其传递给GCC:
-Wno声明后的语句

例如:

ccflags-y := -std=gnu99 -Wno-declaration-after-statement

您还可以在Makefile中指定标志(如果有):

FLAGS=-std=gnu99

linux makefile最初是在您的模块之前调用的,因此GCC可能会得到混合的std=定义。为什么不在函数的开头声明所有变量并以这种方式消除警告呢?这可能是因为C99(语句后声明)的这一特性是Linus似乎不喜欢的。所以linux编码风格禁止这样做。@JensGustedt这很奇怪,我模糊地记得文档中提到过,但我似乎再也找不到它了。@Gonzalo如果您想在正确的时间创建一个常量,比如
const int numTimesFooDone=doFoo(),那么尝试这样做是不走运的。您必须离开
numTimesFooDone
non-
const
,并且有可能在以后某个地方没有注意到就错误地覆盖它,例如
if(numTimesFooDone=3)
。这只是从程序员那里拿走了一些有用的编译器帮助。