You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC报'multiple definition'错误,如何正确声明全局字符数组?

解决方案

问题根源分析

  • 直接在头文件定义char funname[1024] = "";:每个包含该头文件的.c文件都会独立生成一个funname的副本,链接时多个副本冲突,触发multiple definition错误。
  • 用static修饰:每个.c文件会创建自己的static版本funname,其他文件赋值的是各自的局部副本,error.c里的printerror读取的是自己文件内的空数组,所以打印空字符串。

正确实现方式

核心原则:头文件只做声明,变量定义放在单个.c文件中

  1. 在error.h中用extern声明变量
    头文件里仅告知编译器全局变量的存在,不分配内存:

    // error.h
    #ifndef ERROR_H
    #define ERROR_H
    
    // 声明全局变量,不分配内存
    extern char funname[1024];
    
    // 声明错误打印函数
    void printerror(void);
    
    #endif // ERROR_H
    
  2. 在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));
    }
    
  3. 其他.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:50:32