在项目中只调用一次宏
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++ 宏) 在某些情况下被排除在构建之外。
谢谢大家的宝贵时间,很抱歉提出愚蠢的问题。
我正在尝试在项目中设置 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++ 宏) 在某些情况下被排除在构建之外。
谢谢大家的宝贵时间,很抱歉提出愚蠢的问题。