C++ C和x2B中uint64的正确使用/包括+;

C++ C和x2B中uint64的正确使用/包括+;,c++,c++11,C++,C++11,作为参考,我是用C++11编译的 我正在开始编写一个象棋引擎,使用棋盘的位图表示作为一种以棋子为中心的方法。似乎使用的合适类型是uint64_t,但是,在网上搜索了很多之后,我对这里的“最佳实践”有点不确定 我开始为游戏板定义.hpp文件。 首先,我对不同代码似乎表现出的类似行为感到困惑 #include <cstdint> uint64_t board; #包括 uint64_t板; 及 #包括 标准:uint64_t板; 两者都很好。这两者的区别是什么?一个比另一个好吗 此

作为参考,我是用C++11编译的

我正在开始编写一个象棋引擎,使用棋盘的位图表示作为一种以棋子为中心的方法。似乎使用的合适类型是uint64_t,但是,在网上搜索了很多之后,我对这里的“最佳实践”有点不确定

我开始为游戏板定义.hpp文件。 首先,我对不同代码似乎表现出的类似行为感到困惑

#include <cstdint>
uint64_t board;
#包括
uint64_t板;

#包括
标准:uint64_t板;
两者都很好。这两者的区别是什么?一个比另一个好吗

此外,我注意到我甚至不需要包括cstdint就可以使用uint64\u t:

#include <iostream>
uint64_t board;
#包括
uint64_t板;

#包括
uint64标准:电路板;
两者都可以很好地编译,就像上面的两个cstdint示例一样。因此,对于uint64_t应该如何在C++11中使用,以及为什么所有这4个示例都做完全相同的事情,我感到非常困惑。有人告诉我您想使用cstdint,但似乎iostream也提供def类型?是否有“最佳/最安全”的特定方式(例如,在名称空间冲突方面)

>代码> >代码>标题作为C++传统的一部分存在于C++中。标准库没有重新发明轮子,而是重用了C标准库的这些有用部分。现在,不同之处在于头被重命名,它们必须在名称空间
std
中定义它们的符号。它们还可以将它们添加到全局命名空间中。请注意,他们可以这样做,而不是必须这样做

这是因为这些头(作为实现细节)将包括纯C头
,并根据全局符号定义
std::
符号。但这不是你可以依赖的。有一天,标准库实现者可能会决定不再这样做。如果您包括
cstdint
并使用
uint64\u t
而不是
std::uint64\u t
,则您的程序可能会随机成功停止构建

唯一的保证是
std
名称空间中的符号将存在。所以你应该使用这些符号而不是全局符号

现在,作为其自身实现的一部分,标准库可能会在自身中交叉包含自己的头。为了实现
,您的版本很可能包含
。但是,这是一个<强>实现细节<强>,而不是C++标准的一个硬要求。如果标准库的版本发生更改,并且不再这样做,则代码将无法生成

总之,要使代码在不同的编译器和标准库实现之间尽可能可移植,请执行以下操作:

  • 包括
    并使用它在名称空间
    std
    中定义的符号,这些符号必须存在。1
  • 如果您需要任何符号,请在文档保证存在的位置包含标题。不要依赖于偶然发现的实现细节


  • (1) 从技术上讲,允许未定义固定宽度整数类型。这是因为该标准意识到,并非所有平台都可以定义所有非平台。实际上,它们都可以在现代台式机上使用。

    对答案进行了精彩的解释,非常有用,谢谢。相关:和
    #include <iostream>
    uint64_t board;
    
    #include <iostream>
    uint64_t std::board;