在项目中只调用一次宏

Calling a macro only once in the project

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

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

有什么好的方法可以解决这个问题吗?还是我必须尝试在链接时强制执行不同的文件顺序?

我对这类问题没有太多经验,尝试用谷歌搜索,找不到解决方案。如果已经有类似问题,抱歉,没找到。

感谢您的帮助!

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

void setup_logging() {
  static std::once_flag once;
  std::call_once(once, [] () { INITIALIZE_EASYLOGGINGPP(); });
}

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

#ifndef INITIALIZE_EASYLOGGINGPP
#define INITIALIZE_EASYLOGGINGPP SomeLogic
#endif

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

有位程序员说得对,链接+宏没有问题。

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

谢谢大家的宝贵时间,很抱歉提出愚蠢的问题。