首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ># definition函数的多重定义

# definition函数的多重定义
EN

Stack Overflow用户
提问于 2015-05-14 20:21:35
回答 2查看 582关注 0票数 4

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

代码语言:javascript
复制
//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++给:

代码语言:javascript
复制
/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

有线索吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-14 20:28:01

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

代码语言:javascript
复制
ofstream debug_log("debug.log");

行,您将有多个定义。

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

标题

代码语言:javascript
复制
#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文件

代码语言:javascript
复制
ofstream debug_log("debug.log");
票数 4
EN

Stack Overflow用户

发布于 2015-05-14 20:24:37

每个最终实现#include的logger.h的源文件都会看到以下内容:

代码语言:javascript
复制
ofstream debug_log("debug.log");

所以创建这个对象。现在有多个名为debug_log的对象。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30246639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档