在我的项目中,这已在 boost_log.h
中定义:
#define LOG_INFO \
if (_LOG_LEVEL >= 4) \
BOOST_LOG_TRIVIAL(info) _LOG_LOCATION
这很好用。但最近,我添加了一个库,其中包含头文件 syslog.h
并且它还有 LOG_INFO
。由于此冲突,我无法构建该项目。
有什么优雅的方法可以解决这个问题吗?重命名实际上并不是一个选项,因为 boost_log.h
中的宏几乎被其他开发人员到处使用,所以我无法提交重命名的宏。
最佳答案
因此您有以下设置:
#include "one.h" /* defines LOG_INFO */
#include "two.h" /* defines LOG_INFO as something else -> clash! */
两个定义都是宏。宏展开是在编译之前发生的一个步骤;编译器只能看到预处理后的文本。
您可以使用 #undef
指令删除使用 #define
定义的宏:
#define SQUARE(X) ((X)*(X))
int x = SQUARE(8); /* Expand to ((8)*(8)) == 64 */
#undef SQUARE
int y = SQUARE(17); /* No expansion */
最后一行仍然是合法的 C 代码,但它假定 MACRO
是一个函数,如果未定义,则会提示。
因此,长话短说,解决您问题的一种方法可能是:
#include "one.h" /* defined LOG_INFO */
#ifdef LOG_INFO
#undef LOG_INFO /* delete LOG_INFO macro */
#endif
#include "two.h" /* legally define a fresh LOG_INFO */
在这种情况下,您只有 two.h
中的 LOG_INFO
定义。 (ifdef
只是为了确保 LOG_INFO
已实际定义,并避免 #undef
出现错误。)这应该会消除冲突。
关于c - 来自宏的问题具有相同的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27989912/