宏中的 typedef 字符
typedef char in a macro
我正在阅读用 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]
我不明白的是
上面代码的最后一行是做什么的?
typedef char
这里好奇怪,完全看不懂
- 代入
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]
这定义了大小为 1 的 char
数组的 typedef,仅当 expression
的计算结果为真时。如果表达式的计算结果为 false,则存在编译时错误,typedef 的名称是有关错误的提示。
请注意,这有一些变体。有些使用负数或空大小而不是编译错误,即它们定义如下:
template <> struct compile_time_assert<false> { enum { value = -1 }; };
不过其实有一种简洁的表达方式(你可以看看in this question):
typedef char static_assert_something[expression ? 1 : -1];
我正在阅读用 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]
我不明白的是
上面代码的最后一行是做什么的?
typedef char
这里好奇怪,完全看不懂- 代入
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]
这定义了大小为 1 的 char
数组的 typedef,仅当 expression
的计算结果为真时。如果表达式的计算结果为 false,则存在编译时错误,typedef 的名称是有关错误的提示。
请注意,这有一些变体。有些使用负数或空大小而不是编译错误,即它们定义如下:
template <> struct compile_time_assert<false> { enum { value = -1 }; };
不过其实有一种简洁的表达方式(你可以看看in this question):
typedef char static_assert_something[expression ? 1 : -1];