gpt4 book ai didi

c++ - C++中的编译时断言

转载 作者:行者123 更新时间:2023-11-30 04:18:26 25 4
gpt4 key购买 nike

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

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 * 使用 ""的情况下工作

最佳答案

如果将表达式传递给计算结果为 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”作为数组名称。

关于c++ - C++中的编译时断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16437431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com