[英]typedef char in a macro
我正在閱讀用C ++編寫的機器學習庫dlib。 我在頭文件中遇到了定義了一系列宏的代碼。 我在理解以下代碼時遇到困難
#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
為true時定義結構,否則未定義類型。
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]
僅當expression
計算結果為true時,才在大小為1的char
數組上定義typedef。 如果表達式的計算結果為false,則說明存在編譯時錯誤,並且typedef的名稱是有關該錯誤的提示。
請注意,這有一些變體。 有些使用負數或null大小而不是編譯錯誤,即它們定義了以下內容:
template <> struct compile_time_assert<false> { enum { value = -1 }; };
但實際上有一種簡潔的表述方式(您可以在此問題中看到它):
typedef char static_assert_something[expression ? 1 : -1];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.