簡體   English   中英

宏中的typedef char

[英]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] 

我不明白的是

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

  2. 這里的typedef char很奇怪,我一點也不明白。

  3. 替換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM