在C语言的某个工程中,一个不是主函数的函数如果引用另一个文件中的某个函数,是不是要先用extern引入?比如下面的代码:
void DisplayInit(void)
{
extern void FramebufferInit(void);
FramebufferInit();
}
在C语言中,不需要在函数内部用 extern
再次声明另一个文件中的函数。以下是原因和正确的做法:
1. extern
的默认行为
- 在C语言中,函数的声明本身就是具有
extern
的默认属性。 - 如果函数在另一个文件中定义了,只需要在当前文件包含一个对应的声明即可,比如通过头文件或直接在文件顶部写声明。
2. 你代码中的问题
void DisplayInit(void)
{
extern void FramebufferInit(void); // 不需要在函数内部声明
FramebufferInit();
}
- 在函数内部写
extern void FramebufferInit(void);
是多余的,虽然它不会导致错误,但也没有必要。 - 更好的做法是将
FramebufferInit
的声明放在文件顶部,或者更推荐的是通过头文件引用。
3. 正确的做法
假设 FramebufferInit
函数定义在另一个文件 framebuffer.c
中,应该这样组织代码:
1. 在 framebuffer.h
文件中声明:
#ifndef FRAMEBUFFER_H
#define FRAMEBUFFER_H
void FramebufferInit(void);
#endif // FRAMEBUFFER_H
2. 在 framebuffer.c
文件中定义:
#include "framebuffer.h"
void FramebufferInit(void) {
// Function implementation
}
3. 在使用 FramebufferInit
的文件中包含头文件:
#include "framebuffer.h"
void DisplayInit(void) {
FramebufferInit();
}
4. 为什么推荐使用头文件
- 避免重复声明函数,方便管理。
- 保证声明和定义的一致性,减少维护难度。
- 编译器会对头文件中的声明进行检查,提高代码的健壮性。
总结
在函数内部使用 extern
不是正确的做法,函数声明应放在文件顶部或通过头文件进行管理。如果 FramebufferInit
来自其他文件,直接包含其声明即可。
经实测,像下面这样写编译是没有问题的:
扩展阅读:
详解C语言中的关键词:extern以及它需要注意的事项