- 此问题在此处已有答案**:
(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
的错误消息。printerror
是error. 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作为函数名。
我该怎么办?
1条答案
按热度按时间tgabmvqs1#
本声明
也是变量
funname
的定义。因此,如果标题包含在多个翻译单元中,则同一变量将有多个定义。您应该在标头中声明变量,例如
然后在某个模块中定义它
至于这个宣言
则变量
funname
具有内部链接,这意味着包含标头的每个翻译单元将具有其自己的单独变量。