系统相关
首页 > 系统相关> > 为什么extern声明应该在.c文件之外(根据linux编码样式)

为什么extern声明应该在.c文件之外(根据linux编码样式)

作者:互联网

根据checkpatch.pl脚本“外部声明在.c文件外部”
(用于检查补丁是否遵循编码风格)
注意:这在没有编译警告的情况下工作得很好
通过将extern声明放在.h文件中,可以解决此问题.

a.c
-----
int x;
...

b.c 
----
extern int x;

==> checkpatch抱怨

a.h
-----
extern int x;

a.c
----
int x;

b.c
---- 
#include "a.h"

==>不抱怨

我想了解为什么这更好

我的猜测.
理想情况下,将代码拆分为文件,以便对代码进行模块化(每个文件都是一个模块)
模块导出的接口放置在头文件中,以便其他模块(或.c文件)可以包括它们.因此,如果任何模块要在外部公开某些变量,则必须在与该模块相对应的Header文件中添加extern声明.

同样,具有与每个模块相对应的头文件(.c文件)似乎
到许多头文件.

解决方法:

在a.c文件中也包含a.h甚至会更好.这样,编译器可以验证声明和定义是否匹配.

a.h
-----
extern int x;

a.c
----
#include "a.h"  <<--- add this
int x;

b.c
---- 
#include "a.h"

正如您所假设的那样,该规则的原因是我们应该使用编译器来检查我们在做什么.细微的细节要好得多.

如果我们允许在各处使用extern声明,那么如果我们想将x更改为其他类型,就会遇到麻烦.我们必须扫描多少个.c文件才能找到所有extern int x?很多.如果这样做,我们可能还会发现一些extern char x错误.糟糕!

仅在头文件中包含一个声明,并在需要的地方包含它,为我们节省了很多麻烦.在任何实际项目中,x始终不是头文件中的唯一元素,因此您不必节省文件数.

标签:extern,linux-kernel,coding-style,c-3,linux
来源: https://codeday.me/bug/20191031/1974554.html