c++ - 宏中的 typedef 字符

标签 c++ macros dlib

我正在阅读用 C++ 编写的机器学习库 dlib。我在 header file 中发现了一个代码它定义了一堆宏。我很难理解以下代码

#ifndef BOOST_JOIN
#define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y )
#define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y)
#define BOOST_DO_JOIN2( X, Y ) X##Y
#endif
//  a bunch of other code

namespace dlib
{
template <bool value> struct compile_time_assert;
template <> struct compile_time_assert<true> { enum {value=1};  };
// a bunch of other definitions
}

#define COMPILE_TIME_ASSERT(expression) \
    DLIB_NO_WARN_UNUSED typedef char BOOST_JOIN(DLIB_CTA, __LINE__)[::dlib::compile_time_assert<(bool)(expression)>::value] 

我不明白的是

  1. 上面代码的最后一行是做什么的?

  2. typedef char这里好奇怪,完全看不懂

  3. BOOST_JOIN代入后变成DLIB_CTA__LINE__[1],为什么是数组?合法吗?

最佳答案

这是一个 C++03 静态断言,或者至少是用于模拟它的解决方法。

以下仅在 value 时才定义一个结构体为真,否则类型未定义。

template <bool value> struct compile_time_assert;
template <> struct compile_time_assert<true> { enum {value=1};  };

这意味着 compile_time_assert<true>::value完全正确,但是 compile_time_assert<false>::value是编译错误,因为 compile_time_assert<false>未定义。

现在,断言的核心:

DLIB_NO_WARN_UNUSED typedef char BOOST_JOIN(DLIB_CTA, __LINE__) ::dlib::compile_time_assert<(bool)(expression)>::value]

这在 char 上定义了一个 typedef大小为 1 的数组,仅当 expression 时评估为真。如果表达式的计算结果为假,则存在编译时错误,typedef 的名称是关于错误的提示。

请注意,这有一些变体。有些使用负数或 null 大小而不是编译错误,即它们定义了以下内容:

template <> struct compile_time_assert<false> { enum { value = -1 };  };

但实际上有一种简洁的表达方式(你可以看到它 in this question ):

typedef char static_assert_something[expression ? 1 : -1];

关于c++ - 宏中的 typedef 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29522749/

相关文章:

c++ - 从 C++ 中的 QML 文件加载属性

c++ - 为什么我的字符串没有被打印出来?

c++ - 针对预定义种子列表进行字符串测试的最快 C++ 算法(不区分大小写)

c++ - 没有或最小开销的函数组合宏

python-3.x - 检测在 dlib.image_window() 中按下的键

依赖于 dlib 的 python 可执行文件不起作用

python - macOS - 安装 dlib 时遇到问题

C++ 复制构造函数和 STL 映射

rust - 如何在用户空间中实现复杂的宏,如 `format_args!`?

objective-c - 自动装箱 NSArray?