#define函数的多个定义

multiple definition of #define function

本文关键字:定义 函数 #define      更新时间:2023-10-16

我有logger.h文件,并定义了一个用于日志记录的宏函数:

//logger.h:
#ifndef _LOGGER_H_
#define _LOGGER_H_
#ifdef LOG_DEBUG
    ofstream debug_log("debug.log");
    #define log(...) debug_log << __FILE__ << ":" << __PRETTY_FUNCTION__ << ":" << __LINE__ << "| " << __VA_ARGS__ << std::endl
#else
    #define log(...)
#endif
#endif

这个头文件包含在多个c文件中。并使用log()函数。g++给出:

/tmp/ccMAjYSm.o:(.bss+0x0): multiple definition of `debug_log'
/tmp/ccHj3w7u.o:(.bss+0x0): first defined here
/tmp/cc3LQ9GQ.o:(.bss+0x0): multiple definition of `debug_log'
/tmp/ccHj3w7u.o:(.bss+0x0): first defined here

什么线索吗?

如果您在项目级别(或在多个翻译单元中)声明LOG_DEBUG,他们都将看到

ofstream debug_log("debug.log");

行,你将有多个定义。

一个可能的解决方案:把它放在一个单独的翻译单元中,同时让所有其他人都知道它的存在

#ifndef _LOGGER_H_
#define _LOGGER_H_
#ifdef LOG_DEBUG
    extern ofstream debug_log;
    #define log(...) debug_log << __FILE__ << ":" << __PRETTY_FUNCTION__ << ":" << __LINE__ << "| " << __VA_ARGS__ << std::endl
#else
    #define log(...)
#endif
#endif

cpp文件

ofstream debug_log("debug.log");

最终#include的log .h的每个源文件将看到以下内容:

ofstream debug_log("debug.log");

,然后创建该对象。现在你有多个对象命名为debug_log

在这里向前声明对象,但将实例化放在.cpp文件中。