首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在项目中只能调用宏一次

在项目中只能调用宏一次
EN

Stack Overflow用户
提问于 2017-08-18 16:02:40
回答 3查看 620关注 0票数 0

我正在尝试在项目中设置easylogging++,我遇到了以下问题:

INITIALIZE_EASYLOGGINGPP在项目中只能调用一次。现在,如果我从我的main.cpp调用这个宏,并且只在main.cpp中包含easylogging++.h -一切正常。但是,当我试图在更多的.cpp文件中包含easylogging++.h时,我遇到了未定义引用的链接器问题(就像宏还没有被调用一样)。如果我把对这个宏的调用放在一个按字母顺序排在main.cpp之前的文件中,链接器就会正常地解决所有问题。在链接阶段,对象按字母顺序排序。

有没有解决这个问题的好方法?或者我必须尝试在链接时强制不同的文件顺序?

我对这类问题没有太多的经验,我试着在谷歌上搜索,但找不到解决方案。如果已经有类似的问题,对不起,找不到。

谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-18 16:50:06

一些程序员是对的,linking+macroes没有问题。

在尝试重新创建最小示例并将其发布到此处后,我意识到在某些情况下,CMakeLists.txt中存在一个错误,导致main.cpp (我在其中展开了easylogging++宏)被排除在构建之外。

感谢大家的宝贵时间,并为这个愚蠢的问题道歉。

票数 0
EN

Stack Overflow用户

发布于 2017-08-18 16:06:27

也许您可以将调用包装在使用std::call_once()调用的函数中,例如:

代码语言:javascript
复制
void setup_logging() {
  static std::once_flag once;
  std::call_once(once, [] () { INITIALIZE_EASYLOGGINGPP(); });
}

这样,您可以多次调用setup_logging(),但宏只被调用一次。

票数 1
EN

Stack Overflow用户

发布于 2017-08-18 16:17:58

代码语言:javascript
复制
#ifndef INITIALIZE_EASYLOGGINGPP
#define INITIALIZE_EASYLOGGINGPP SomeLogic
#endif

#ifndef将检查是否已经定义了令牌,在这种情况下,这一部分将被忽略。

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

https://stackoverflow.com/questions/45751534

复制
相关文章

相似问题

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