c - 来自宏的问题具有相同的名称

标签 c linux qt macros

在我的项目中,这已在 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/

相关文章:

c++ - 如何查找变量是在堆栈还是堆中分配?

c - 为什么当我放入值时,我的二维数组在索引处显示正确的值,而不是我稍后尝试访问它们的值? (C)

c - 对于已连接的非阻塞套接字,write 总是在一段时间后返回 EAGAIN

c - C中的内存计算

php - MySQL PHP 未将完整文件存储到 BLOB

c++ - Qt 与 WinRT C++ 构建问题

c - 覆盖 glibc 崩溃

C 指针和数组声明

Qt Designer vs Qt Quick Designer vs Qt Creator?

c++ - 如何在使用 QQmlApplicationEngine 时从 C++ 访问我的 Window 对象属性?