[英]Why can I use size_t and std::size_t in MSVS without the traditional headers?
我正在使用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
。 這只是一個標頭依賴,我可以通過正確的包含避免它嗎? 這仍然無法解釋為什么我可以用命名空間范圍調用它。
( 我沒有using namespace std
。)
這個問題意味着std庫中的所有頭文件都不應該有定義。
嚴格來說,您的代碼是非法的。 size_t
類型需要在以下標頭中聲明:
<cstddef>
<cstdio>
<cstdlib>
<cstring>
<ctime>
<cwchar>
但是標准也允許標准標題包含其他標准標題。 因此,很可能MSVC使用的標准庫中的頭<vector>
包括上面的標題之一。 這是允許的,但不是標准規定的,因此這將適用於您的設置,但可能無法在其他標准庫實現上工作,即使在您使用的同一個版本的未來版本上也是如此。
因此,最后嘗試包括標准所需的所有標題,以用於您正在使用的所有定義。
恕我直言,這是一個錯誤的行為,但是C ++支付向后兼容包含系統所需的價格,這個包含系統多年前似乎是一個合理的設計。 這種局限性和缺點在今天是眾所周知的,因此委員會正在研究模塊,這是現有包容機制的現代替代方案。
至於為什么你可以使用size_t
而沒有std::
size_t
<cstddef>
是聲明std::size_t
所必需的,也可以選擇在全局范圍內聲明(或引入聲明) size_t
。
<stddef.h>
是一個C
向后兼容的頭,它在全局范圍內聲明了size_t
。
因此<cstddef>
在全局級別聲明size_t
並由<vector>
包含<vector>
或<stddef.h>
包含在<vector>
- 很可能通過<cstddef>
間接<cstddef>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.