簡體   English   中英

為什么我可以在MSVS中使用size_t和std :: size_t而不使用傳統的頭文件?

[英]Why can I use size_t and std::size_t in MSVS without the traditional headers?

我正在使用Visual Studio 2017社區版。 它允許我使用size_tstd::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>

https://stackoverflow.com/a/283023/2805305

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM