“某事”的多重定义

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;

这使它成为一个声明。现在一切正常,但您必须编译额外的模块,并将其包含在链接阶段。 (具体操作取决于您的开发工具。)

【讨论】:

以上是关于“某事”的多重定义的主要内容,如果未能解决你的问题,请参考以下文章

Linux自动化运维之Cobbler(自定义重装)

在 Laravel Auth 中自定义重定向

spring-retry实现方法请求重试

来自 AuthorizationHandler (ASP.NET Core) 的自定义重定向

python自定义重试装饰器

WooCommerce 中特定产品的基于地理位置的自定义重定向