- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Visual Studio 2017 社区版。它允许我在没有适当包含的情况下同时使用 size_t
和 std::size_t
。它似乎适用于大多数 std 库。我认为这是因为图书馆本身的一部分使用它。例如,我发现导致这种行为的一个例子是vector
。
#include <vector>
#include <iostream>
int main()
{
size_t a = 42;
std::size_t b = 0;
std::cout << a << b;
std::cin.ignore();
}
大概这是因为 size()
函数返回一个 std::size_t
。这只是一个 header 依赖项,我可以通过适当的包含来避免它吗?这仍然不能解释为什么我可以使用命名空间范围调用它。
(我没有使用 using namespace std
。)
This question 暗示并非标准库中的所有 header 都应具有定义。
最佳答案
严格来说你的代码是非法的。 size_t
需要在以下 header 中声明类型:
<cstddef>
<cstdio>
<cstdlib>
<cstring>
<ctime>
<cwchar>
而且该标准还允许标准 header 包含其他标准 header 。所以很可能标题 <vector>
MSVC 使用的标准库中包含上述 header 之一。这是允许的,但不是标准强制要求的,因此这将适用于您的设置,但可能无法适用于其他标准库实现,即使是您正在使用的同一标准库实现的 future 版本。
因此,总而言之,尝试为您正在使用的所有定义包含标准要求的所有 header 。
恕我直言,这是一个错误的行为,但这是 C++ 为向后兼容包含系统而付出的必要代价,这在多年前似乎是一个合理的设计。其局限性和缺点如今已众所周知,因此委员会正在研究模块,这是当前包容机制的现代替代方案。
至于为什么可以使用size_t
没有std::
:
<cstddef>
需要申报std::size_t
并且还可以选择声明(或引入声明)size_t
在全局范围内。
<stddef.h>
是 C
向后兼容 header ,它声明 size_t
在全局范围内。
所以要么 <cstddef>
声明 size_t
在全局范围内,包含在 <vector>
中或 <stddef.h>
包含在 <vector>
中- 很可能间接通过 <cstddef>
.
关于c++ - 为什么我可以在没有传统 header 的情况下在 MSVS 中使用 size_t 和 std::size_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49844975/
我是 Java 新手,这是我的代码, if( a.name == b.name && a.displayname == b.displayname && a.linknam
在下面的场景中,我有一个 bool 值。根据结果,我调用完全相同的函数,唯一的区别是参数的数量。 var myBoolean = ... if (myBoolean) { retrieve
我是一名研究 C++ 的 C 开发人员: 我是否正确理解如果我抛出异常然后堆栈将展开直到找到第一个异常处理程序?是否可以在不展开的情况下在任何 throw 上打开调试器(即不离开声明它的范围或任何更高
在修复庞大代码库中的错误时,我观察到一个奇怪的情况,其中引用的动态类型从原始 Derived 类型更改为 Base 类型!我提供了最少的代码来解释问题: struct Base { // some
我正在尝试用 C# 扩展给定的代码,但由于缺乏编程经验,我有点陷入困境。 使用 Visual Studio 社区,我尝试通过控制台读出 CPU 核心温度。该代码使用开关/外壳来查找传感器的特定名称(即
这可能是一个哲学问题。 假设您正在向页面发出 AJAX 请求(这是使用 Prototype): new Ajax.Request('target.asp', { method:"post", pa
我有以下 HTML 代码,我无法在所有浏览器中正常工作: 我试图在移动到
我对 Swift 很陌生。我如何从 addPin 函数中检索注释并能够在我的 addLocation 操作 (buttonPressed) 中使用它。我正在尝试使用压力触摸在 map 上添加图钉,在两
我设置了一个详细 View ,我是否有几个 Nib 文件根据在 Root View Controller 的表中选择的项目来加载。 我发现,对于 Nibs 的类,永远不会调用 viewDidUnloa
我需要动态访问 json 文件并使用以下代码。在本例中,“bpicsel”和“temp”是变量。最终结果类似于“data[0].extit1” var title="data["+bpicsel+"]
我需要使用第三方 WCF 服务。我已经在我的证书存储中配置了所需的证书,但是在调用 WCF 服务时出现以下异常。 向 https://XXXX.com/AHSharedServices/Custome
在几个 SO 答案(1、2)中,建议如果存在冲突则不应触发 INSERT 触发器,ON CONFLICT DO NOTHING 在触发语句中。也许我理解错了,但在我的实验中似乎并非如此。 这是我的 S
如果进行修改,则会给出org.hibernate.NonUniqueObjectException。在我的 BidderBO 类(class)中 @Override @Transactional(pr
我使用 indexOf() 方法来精细地查找数组中的对象。 直到此刻我查了一些资料,发现代码应该无法正常工作。 我在reducer中尝试了上面的代码,它成功了 let tmp = state.find
假设我有以下表格: CREATE TABLE Game ( GameID INT UNSIGNED NOT NULL, GameType TINYINT UNSIGNED NOT NU
代码: Alamofire.request(URL(string: imageUrl)!).downloadProgress(closure: { (progress) in
我是一名优秀的程序员,十分优秀!