gpt4 book ai didi

c++ - 在 C++ 中正确使用/包含 uint64_t

转载 作者:IT老高 更新时间:2023-10-28 21:42:02 29 4
gpt4 key购买 nike

作为引用,我在 C++11 中编译。

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

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

#include <cstdint>
uint64_t board;

#include <cstdint>
std::uint64_t board;

两者都编译得很好。两者有什么区别?这个比那个好吗?

此外,我注意到我什至不需要包含 cstdint 就可以使用 uint64_t :

#include <iostream>
uint64_t board;

#include <iostream>
uint64_t std::board;

两者都编译得很好,就像上面的 2 个 cstdint 示例一样。因此,我很困惑 uint64_t 应该如何在 C++11 中使用,以及为什么所有这 4 个示例都做完全相同的事情。有人告诉我你想使用 cstdint ,但似乎 iostream 也提供了类型 def ?是否有“最佳/最安全”的特定方式(例如在命名空间冲突方面)?

最佳答案

<cthing>头文件作为其 C 遗产的一部分存在于 C++ 中。标准库不是重新发明轮子,而是重用 C 标准库的这些有用部分。现在,不同之处在于标题被重命名,并且它们必须在命名空间 std 中定义它们的符号。 .他们还可能将它们添加到全局命名空间。请注意,他们可以这样做,而不是必须

这是因为这些头文件(作为实现细节)将包含纯 C 头文件 <thing.h>并定义 std::就全局符号而言。但这不是你可以依赖的。标准库的实现者有一天可能会决定不再那样做。如果您包括 cstdint并使用了uint64_t而不是 std::uint64_t ,您的程序可能会随机停止构建成功。

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

现在,作为其自身实现的一部分,标准库可以在自身内部交叉包含自己的 header 。您的版本很可能包含 <cstdint>为了实现<iostream> .但同样,这是一个实现细节,而不是 C++ 标准的硬性要求。如果您的标准库版本发生更改,并且不再更改,您的代码将无法构建。

总而言之,让您的代码在不同的编译器和标准库实现之间尽可能可移植:

  1. 包括 <cstdint>并使用它在命名空间 std 中定义的符号,这些都是必须存在的。1
  2. 如果您需要任何符号,请在文档保证它存在的地方包含标题。不要依赖您偶然发现的实现细节。

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

关于c++ - 在 C++ 中正确使用/包含 uint64_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44667971/

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