【问题标题】:compile time assertion in c++C++中的编译时断言
【发布时间】:2013-05-08 09:45:00
【问题描述】:

我正在阅读编译时断言,在网上搜索后我得到了一些我不明白的代码。

template <bool> struct CompileAssert {};
#define COMPILE_ASSERT(expr, msg) \
    typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]

如下使用了这个 COMPILE_ASSERT。

COMPILE_ASSERT(!sizeof(T*), PassRefPtr_should_never_be_assigned_to)

但我没有得到这个想法。有人可以帮助我理解上面的代码。 第二对这段代码感到困惑

typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]

#define 会将 COMPILE_ASSERT(expr, msg) 替换为上述表达式。但是如何 msg[bool(expr) ? 1 : -1] CompileAssert 的替代类型。

请有人详细而简单地解释一下。我有很多很多问题。

就像为什么 message(PassRefPtr_should_never_be_assigned_to) 不使用 "" 作为 char * 的原因

【问题讨论】:

    标签: c++ generic-programming


    【解决方案1】:

    如果将表达式传递给计算结果为 false 的宏,宏将给出如下类型定义:

    typedef CompileAssert<false> PassRefPtr_should_never_be_assigned_to[false ? 1 : -1];
    

    这是

    typedef CompileAssert<false> PassRefPtr_should_never_be_assigned_to[-1];
    

    因此,由于不允许使用负数组长度,编译器将为 typedef 发出错误,其中包含“msg”作为数组名称。

    【讨论】:

    • 所以不管天气 complieAssert 还是 complileAssert ,它只是检查数组名的有效性是否正确......所以我认为如果我使用它会一样typedef int msg[bool(expr) ? 1:-1]
    【解决方案2】:

    typedef 将根据 expr 的值命名合法或非法的代码。

    假设bool(expr) 是true。在这种情况下,typedef 等价于

    typedef CompileAssert<true> msg[1];
    

    这是一个由CompileAssert&lt;true&gt; 结构组成的单元素数组,名为msg。由于CompileAssert&lt;bool&gt; 是一个已定义的结构,所以一切正常。

    但是,如果 bool(expr) 是 false,则 typedef 将等同于以下内容:

    typedef CompileAssert<false> msg[-1];
    

    这当然是非法的(你不能创建一个大小为-1的数组),所以编译器会报错msg is ill-formed。由于msg 是宏参数,它实际上是COMPILE_ASSERT 中提供的文本,因此您的示例的错误消息可能如下所示:

    Cannot create array PassRefPtr_should_never_be_assigned_to of size -1.
    

    还要注意 C++11 有一个内置的static_assert。

    【讨论】:

    • typedef CompileAssert&lt;false&gt; msg[-1]; 你的意思是(把真改成假)
    • 所以不管天气 complieAssert 还是 complileAssert ,它只是检查数组名的有效性是否正确......所以我认为如果我使用它会一样typedef int msg[bool(expr) ? 1 : -1] –
    • @YSBhai 是的,它与int 一样好用。通常,当您只为true 案例提供正确定义时,会使用布尔模板。这个宏似乎在不了解它们的情况下混合了这些方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2014-08-11
    相关资源
    最近更新 更多