【问题标题】:typedef char in a macro宏中的 typedef char
【发布时间】:2015-06-13 21:20:28
【问题描述】:

我正在阅读用 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++ macros dlib


    【解决方案1】:

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

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

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

    这意味着compile_time_assert&lt;true&gt;::value 完全正确,但compile_time_assert&lt;false&gt;::value 是一个编译错误,因为compile_time_assert&lt;false&gt; 没有定义。

    现在,断言的核心:

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

    这会在大小为 1 的 char 数组上定义 typedef,前提是 expression 的计算结果为 true。如果表达式的计算结果为 false,则存在编译时错误,并且 typedef 的名称是有关错误的提示。

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

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

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

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

    【讨论】:

    • 感谢您的回复。 DLIB_NO_WARN_UNUSEDCOMPILE_TIME_ASSERT(expression)typedef 之间在这里做什么?
    • 可能是编译器特定的东西来禁用有关未使用 typedef 的警告(因为您通常不会使用此 typedef,并且一些编译器会警告它)。
    • 但是 dlib 是库名,所以把 DLIB_NO_WARN_UNUSED 放在 COMPILE_TIME_ASSERT(expression)typedef 之间,我不明白它在语法上是如何正确的。
    • DLIB_NO_WARN_UNUSED 是一个宏。它可能是#define DLIB_NO_WARN_UNUSED(所以这将被什么都替换)或#define DLIB_NO_WARN_UNUSED some-compiler-magic
    • 谢谢你的时间,我想我明白了。
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2021-10-07
    • 2023-03-10
    • 2021-04-15
    • 2011-10-03
    • 2017-08-17
    • 1970-01-01
    相关资源
    最近更新 更多