c ++ std :: types而不是相应的c类型

αλε*_*λυτ 5 c++

例如,考虑<cstdint>标题.C++标准:

标头定义了与C标准库标头相同的所有类型和宏<stdint.h>.

那么是否需要在某处使用say std::int8_t而不是短C形式int8_t

Nat*_*ica 6

那么是否需要在某处使用say std :: int8_t而不是短C形式int8_t?

是.Per [headers]/4如果在全局命名空间中定义了C名称,则未指定.因此你需要std::int8_t使用int8_t.它不保证std::int8_t存在,只要它确实存在,使用std::int8_t保证可以工作.

您可以添加,using std::int8_t;这样您就不必std::int8_t在整个地方打字.


[headers]/4的相关部分是

但是,在C++标准库中,声明(除了在C中定义为宏的名称除外)都在命名空间std的命名空间范围内.

强调我的

这意味着我们知道它们已被宣布std::.那个部分

未指定这些名称(包括[language.support]中通过[thread]和[depr]添加的任何重载)是否首先在全局命名空间范围内声明,然后通过显式using-declarations([namespace]注入到命名空间std中. udecl]).

然后允许名称在全局命名空间中,但确实需要它.这让实现可以做类似的事情

<cstdint>:

namespace std
{
    #include <stdint.h>
}
Run Code Online (Sandbox Code Playgroud)

要么

<cstdint>:

#include <stdint.h>
namespace std
{
    using ::int8_t;
    using ::int16_t;
    //...
}
Run Code Online (Sandbox Code Playgroud)

Bot完成同样的事情(将名称放入std::)并且是合法的实现,但只有第二个将名称放在全局范围内.