Osa*_*aid 5 c prototype header misra extern
比方说,我们有几个C源文件,如file1.c,file2.c和main.c.我们的功能如下:
file1.c
|---> file1Func1()
|---> file1Func2()
file2.c
|---> file2Func1()
|---> file2Func2()
Run Code Online (Sandbox Code Playgroud)
并且主文件使用这些功能.现在,很自然,我创建并在头文件中添加相应的函数原型file1.h和file2.h,然后在包括这些头main.c使用该功能.
如果我有一个包含超过一千个源(C)文件的非常大的项目,我应该总是为每个源文件创建一个标题(然后添加函数原型).然后包括使用函数的标题?
或使用EXTERN使用别处定义的函数(在其他一些源文件),并依靠链接程序搜索,并在链接时获取从对象文件中的函数?
注意:使用后一种方法会触发没有函数原型的MISRA警告.
作为接口一部分的所有函数,即由另一个模块调用的函数,应该在头文件中具有函数原型.最好与记录如何使用该功能的评论一起.
不属于接口且仅在文件内部使用的函数不应在标头中包含原型.对于此类函数,将原型声明在c文件的顶部,并将其声明为static.
这就是所有(专业)C程序的编写方式.另外,MISRA-C也要求这种声音设计.
永远不应该有理由将extern关键字用于函数.注意一个函数原型就好
void func (void);
Run Code Online (Sandbox Code Playgroud)
完全等同于
extern void func (void);
Run Code Online (Sandbox Code Playgroud)
如果需要使用函数,请包含相关标题.
如果我有一个非常大的项目,包含超过一千个源 (c) 文件,我是否应该始终为每个源文件创建一个标头(然后添加函数原型)?然后包含使用函数的标头?
简短的回答是“是”。
稍长的答案是“是的,但您可以省略头文件中的函数,这些函数是源文件中其他函数的实现细节”。
在头文件中声明函数并#include使用 ing 头文件可确保函数定义和函数调用保持同步。否则,很容易犯错误,并且这些错误是在链接时而不是编译时捕获的。