1

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

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<(bool(expr))>的另一种类型。

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

就像为什么 message(PassRefPtr_should_never_be_assigned_to) 在不使用 "" 的情况下工作 char *

4

2 回答 2

1

typedef根据 的值命名一段合法或非法的代码expr

比方说bool(expr)true。在这种情况下,typedef 等价于

typedef CompileAssert<true> msg[1];

这是一个CompileAssert<true>结构体的 1 元素数组,名为msg. 由于CompileAssert<bool>是一个定义的结构,一切都很好。

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

typedef CompileAssert<false> msg[-1];

这当然是非法的(不能创建大小为 -1 的数组),因此编译器会报告格式错误的错误msg。而且因为msg是宏参数,它实际上是 中提供的文本COMPILE_ASSERT,因此您的示例的错误消息可能如下所示:

Cannot create array PassRefPtr_should_never_be_assigned_to of size -1.

另请注意,C++11 有一个内置的static_assert.

于 2013-05-08T09:50:53.670 回答
1

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

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

这是

typedef CompileAssert<false> PassRefPtr_should_never_be_assigned_to[-1];

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

于 2013-05-08T09:51:15.013 回答