GCC报'multiple definition'错误,如何正确声明全局字符数组?
解决方案
问题根源分析
- 直接在头文件定义
char funname[1024] = "";:每个包含该头文件的.c文件都会独立生成一个funname的副本,链接时多个副本冲突,触发multiple definition错误。 - 用
static修饰:每个.c文件会创建自己的static版本funname,其他文件赋值的是各自的局部副本,error.c里的printerror读取的是自己文件内的空数组,所以打印空字符串。
正确实现方式
核心原则:头文件只做声明,变量定义放在单个.c文件中
在
error.h中用extern声明变量
头文件里仅告知编译器全局变量的存在,不分配内存:// error.h #ifndef ERROR_H #define ERROR_H // 声明全局变量,不分配内存 extern char funname[1024]; // 声明错误打印函数 void printerror(void); #endif // ERROR_H在
error.c中定义变量
全局变量的实际定义放在唯一的.c文件中,确保只有一个内存实例:// error.c #include "error.h" #include <string.h> #include <stdio.h> // 定义全局变量,分配内存并初始化 char funname[1024] = ""; void printerror(void) { printf("错误发生在函数: %s\n", funname); // 可选:打印后清空变量,避免后续错误被旧值干扰 memset(funname, 0, sizeof(funname)); }其他
.c文件使用示例
包含error.h后直接操作funname,所有文件共享同一个全局变量:// file1.c #include "error.h" #include <string.h> void some_function(void) { // 发生错误时赋值,__func__为C标准宏,自动获取当前函数名 strcpy(funname, __func__); // 调用错误打印函数 printerror(); }
编译链接说明
编译单个.c文件:
gcc -c error.c file1.c ...
链接所有目标文件生成可执行程序:
gcc error.o file1.o ... -o your_program
内容的提问来源于stack exchange,提问作者user20333834
相关产品推荐
相关产品推荐

