我有一个日志记录工具,它基本上是对glog +一些我经常需要的实用程序函数的包装。这段代码已经使用了很长一段时间,并且可以在不同的平台(Intel Mac, Ubuntu, Debian)和编译器(gcc, clang)上编译。但是,我无法在Alpine上编译代码。
错误如下:
src/../include/Logging.hpp:52:30: error: expected primary-expression before 'while'
52 | #define myAssert(condition) DCHECK(condition)
| ^~~~~~
我的Logging.hpp中的宏定义如下:
// Only gets compiled for debug configuration
#define myAssert(condition) DCHECK(condition)
在glog的logging.h文件中有一堆与DCHECK相关的宏,因此我只是链接相关文件:https://github.com/google/glog/blob/master/src/glog/logging.h.in
相关的应该是以下几行:
- https://github.com/google/glog/blob/05fbc65278db1aa545ca5cb743c31bc717a48d0f/src/glog/logging.h.in L1327
- https://github.com/google/glog/blob/05fbc65278db1aa545ca5cb743c31bc717a48d0f/src/glog/logging.h.in L1368
为什么不像预期的那样工作?我认为唯一可能的候选是这个GLOG_MSVC_PUSH_DISABLE_WARNING,但这也扩展到no-op。
对于任何看到此问题的人:检查您是否在调试模式下使用日志宏作为初始化列表的一部分,在将指针的内存分配给成员变量之前断言不为空。例子:
explicit MyClass(std::shared_ptr<const data::SomeObject> objectPtr)
: memberVar((myCheck(objectPtr), *objectPtr))
{ }
private:
data::SomeObject objectPtr;
注意初始化列表中的断言。如果在发布时计算结果为空,则会抛出上述错误。这一切都很有意义,但是glog有很多方法来评估这个宏。