完整示例(使用 extern):
- // peripheral.c
- #include <stdio.h>
- // 定义底层函数
- void chip_specific_init(void) {
- printf("Peripheral initialized\n");
- }
- // 定义另一个函数
- void configure_clock(uint32_t freq) {
- printf("Clock set to %d Hz\n", freq);
- }
- // driver.c
- #include <stdio.h>
- // 使用 extern 声明外部函数
- extern void chip_specific_init(void);
- extern void configure_clock(uint32_t freq);
- // 驱动初始化函数
- void driver_init(void) {
- printf("Driver initializing...\n");
- chip_specific_init();
- configure_clock(50000000);
- }
- int main() {
- driver_init();
- return 0;
- }
编译运行:
- gcc peripheral.c driver.c -o firmware
- ./firmware
- # 输出:
- # Driver initializing...
- # Peripheral initialized
- # Clock set to 50000000 Hz
最佳实践建议:
优先使用头文件:对于常规项目,头文件是更可维护的选择
谨慎使用 extern:仅用于特殊情况,如访问未暴露的函数或减少头文件依赖
避免 extern 全局变量:全局变量应通过头文件管理并添加保护
保持一致性:在项目中统一使用一种方法
文档说明:当使用 extern 访问非公开函数时,添加注释说明原因
- // driver.c
- /* 注意:直接访问 peripheral.c 中的内部函数
- * 原因:临时绕过抽象层进行性能优化 */
- extern void internal_optimized_function(void);
总之,虽然 extern 可以用于跨文件函数调用,但在实际项目中,头文件方法更规范、可维护性更好。保留 extern 用于特殊场景,如访问未包含在头文件中的函数或解决特定依赖问题。
|