错误期望主表达式使用日志



我有一个日志记录工具,它基本上是对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有很多方法来评估这个宏。

最新更新