gcc抱怨“'funname'有多个定义”,那么如何声明一个全局字符数组?[duplicate]

sqxo8psd  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(118)
    • 此问题在此处已有答案**:

(19个答案)
5小时前关门了。
我有一个headererror. h,这里是我想要声明全局字符数组funname的地方。
我的想法是在error. h中声明funname,并在我所有的*.c文件中包含这个头文件。funname存储最近一次发生错误的函数名(内置错误+我自己定义的错误)。每个可能产生错误的函数都将其名称分配给funname,如下所示:

//filename: someSourcecode.c

#include "error.h"

int fun1(int a, float b)
{
    strcpy(funname, "fun1");

    if(someUnexpectedEvent)
    {
        errno = MyOwnDefinedMacroWithIntegerValue;
        return -2;
    }
}

我还有一个error. c文件,它打印了相应eerno的错误消息。printerrorerror. c中打印这些错误消息的函数,该函数的定义如下:

//filename: error.c

#include "error.h"

void printerror()
{
    if(errno == USERUNAVAILABLE)  //own defined errno value
    {
        fprintf(stderr, "Error:  %s   user is unavailable\n", funname);
    }

    ... //and so on
}

我的问题:

error.h文件中,如果我像这样(全局地)声明它-char funname[1024] = "";,我单独的*.c编译(每个*.c文件都是用命令gcc -c file1.c编译的),编译时没有任何错误但是当我尝试一次将它们全部链接(gcc file1.o file2.o file3.o file4.o main.o -o bin)时,它显示如下错误:

/usr/bin/ld: bin/file1.o:(.bss+0x0): multiple definition of `originFuncName'; bin/main.o:(.bss+0x0): first defined here
/usr/bin/ld: bin/file2.o:(.bss+0x0): multiple definition of `originFuncName'; bin/main.o:(.bss+0x0): first defined here
/usr/bin/ld: bin/error.o:(.bss+0x0): multiple definition of `originFuncName'; bin/main.o:(.bss+0x0): first defined here
/usr/bin/ld: bin/file3.o:(.bss+0x0): multiple definition of `originFuncName'; bin/main.o:(.bss+0x0): first defined here
/usr/bin/ld: bin/file4.o:(.bss+0x0): multiple definition of `originFuncName'; bin/main.o:(.bss+0x0): first defined here

如果我像这样声明(全局)-static char funname[1024] = "";,那么我在编译和链接时不会有任何问题,它也会正常运行,除了,当错误消息是print时,函数名不会被打印,可能会打印null string作为函数名。
我该怎么办?

tgabmvqs

tgabmvqs1#

本声明

char funname[1024] = "";

也是变量funname的定义。因此,如果标题包含在多个翻译单元中,则同一变量将有多个定义。
您应该在标头中声明变量,例如

extern char funname[1024];

然后在某个模块中定义它

char funname[1024] = "";

至于这个宣言

static char funname[1024] = "";

则变量funname具有内部链接,这意味着包含标头的每个翻译单元将具有其自己的单独变量。

相关问题