gpt4 book ai didi

c++ - 包含 还是 更好?

转载 作者:IT老高 更新时间:2023-10-28 12:43:20 25 4
gpt4 key购买 nike

使用C++11,是不是更好#include <cassert><assert.h> ?还是没有区别?

编辑:

好像Should I include <xxxx.h> or <cxxxx> in C++ programs?认为它归结为污染全局命名空间。这是一个特例吗,因为 assert是一个宏并且没有std::assert ?

最佳答案

<cassert>的内容与 C 标准库头文件 <assert.h> 相同,除了一个名为 static_assert 的宏未定义。1

首选 <cassert> .

所有<xxx.h>不推荐使用 C header (包括 <assert.h>):

D.5 C 标准库头文件 [depr.c.headers]

关于 static_assert 的更新来自 C 的宏

在 D.5 [depr.c.headers] 中,C++ 标准引用了 <xxx.h> header 为“C header :

1 For compatibility with the C standard library, the C++ standard library provides the C headers shown in Table 141.

在 C++14 中,规范引用了 C99 (ISO/IEC 9899:1999)。 C99 没有定义宏 static_assert (在任何标题中)。 C++14 对 <cassert> 有这样的说法在 19.3 [断言]:

2 The contents are the same as the Standard C library header <assert.h>.

C++17 引用了 C11 (SO/IEC 9899:2011),确实定义了 static_assert<assert.h> ,关于 <cassert>在 22.3.1 [cassert.syn] 中:

1 The contents are the same as the C standard library header <assert.h>, except that a macro named static_assert is not defined.

C++14 和 C++17 都定义了 <assert.h>只能引用它们各自的 C 规范,也可以这样:

See also: ISO C 7.2.

(这是指定 <assert.h> 的 C 部分)

我读这篇文章的方式,技术上 <assert.h> ,当使用 C++17 编译器编译时,实际上确实定义了一个名为 static_assert 的宏.但是这样做是没有意义的,我无法想象任何实现实际上都需要这样做。

无论如何,我坚持我上面的建议:

Prefer <cassert>.

这只是 C++ 做事的方式。并且至少在 C++98/03/11/14/17 中,它避免了依赖于弃用的功能。谁知道C++20会带来什么。但是 C++20 绝对不会弃用 <cassert> .


1 22.3.1 标题概要 [cassert.syn]

2 Link to the C++11 specification.

3 Link to the C++17 specification.

关于c++ - 包含 <cassert> 还是 <assert.h> 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43011737/

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