“某事”的多重定义
Posted
技术标签:
【中文标题】“某事”的多重定义【英文标题】:multiple definition of `something' 【发布时间】:2011-08-21 12:04:32 【问题描述】:在“my_header.h”中我定义了
FILE *f;
char *logfile = "my_output.txt";
#define OPEN_LOG f = fopen(logfile, "a")
#define CLOSE_LOG fclose(f)
在“my_source.c”中,我是这样使用的
#include "my_header.h"
....
OPEN_LOG;
fprintf(f, "some strings\n");
CLOSE_LOG;
但是链接器说
my_source.o:(.data+0x0): multiple definition of `logfile'
我该如何解决这个问题?
【问题讨论】:
【参考方案1】:一如既往,不要在头文件中定义变量。因为每次您#include
该头文件时,该变量都会被重新定义(请记住#include
== “复制和粘贴”,有效),导致您看到的链接器错误。
【讨论】:
那我该怎么办?我在一个头文件中定义了它们,这样我就可以在多个 .c 文件中使用它们。 @mahmood:为什么不只写函数,而不是这个宏解决方案?那么你就不需要暴露给外界的变量了。 这也是可能的。但是我想在多个源文件中记录一些东西。它们都应该写在一个日志文件中。所以我决定创建一个全局变量并定义一些宏。为什么不使用宏? @mahmood:好的,但是你为什么不创建一个集中的logging.c
来公开各种日志记录功能呢?然后您的所有其他源文件都可以访问这些功能。
@mahmood:另外,要查看宏的问题,请考虑如果您有 void func1() OPEN_LOG; func2(); CLOSE_LOG ... void func2() OPEN_LOG; ... CLOSE_LOG;
会发生什么。这很快就会变得一团糟。【参考方案2】:
您应该创建一个新文件 (my_stuff.c
),并在其中包含:
char *logfile = "my_output.txt";
.c 文件定义变量。然后将标题更改为具有此而不是定义:
extern char *logfile;
这使它成为一个声明。现在一切正常,但您必须编译额外的模块,并将其包含在链接阶段。 (具体操作取决于您的开发工具。)
【讨论】:
以上是关于“某事”的多重定义的主要内容,如果未能解决你的问题,请参考以下文章