例如,考虑<cstdint>标题.C++标准说:
标头定义了与C标准库标头相同的所有类型和宏
<stdint.h>.
那么是否需要在某处使用say std::int8_t而不是短C形式int8_t?
那么是否需要在某处使用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::)并且是合法的实现,但只有第二个将名称放在全局范围内.