簡體   English   中英

__PTRDIFF_TYPE__與ptrdiff_t

[英]__PTRDIFF_TYPE__ vs. ptrdiff_t

我不明白為什么gnu C編譯器使用兩個具有幾乎相似名稱的不同宏 - __PTRDIFF_TYPE__ptrdiff_t - ,因為它們與語義相同。

這些宏的定義在這里

我問了一個關於這個問題的類似問題。

我復制了這個問題,因為在我的第一篇文章中,我沒有收到我真正需要的答案。

有人可以清楚地詳細解釋gnu C編譯器如何使用它們嗎?

編輯:

這篇文章的目的是了解gcc如何具體地使用這個對象(指針差異類型),從生成詞匯流並插入解析器的那一刻到語義檢查完成並生成IC的那一刻。

ptrdiff_t不是宏,它是由stddef.h定義的typedef名稱。 它在C標准中指定為兩個指針之間的差異類型。

__PTRDIFF_TYPE__是GCC的stddef.h的實現細節。 除非您正在編寫C運行時庫,否則不應使用它。

存在的原因是不允許C編譯器無條件地定義ptrdiff_t 如果包含stddef.h ,該名稱僅獲取其標准指定的含義; 它可以用於其他應用程序。 (請注意,與C ++,C中的標准庫頭不允許 [表現為-如果他們]包括彼此。) __PTRDIFF_TYPE__ ,在另一方面,是出了名,編譯器允許無條件地限定,因為它開始有兩個下划線。 因此__PTRDIFF_TYPE__是無條件預定義的, stddef.h在適當時使用它來定義ptrdiff_t

stddef.h的原因是通過這個間接,而不是裸露

typedef long int ptrdiff_t;  /* or whatever */

是因為定義可能需要根據編譯模式而變化。 例如,在x86-64 / Linux上, ptrdiff_t在默認模式下為long int ,在-m32模式下為int 編譯器必須知道哪個整數類型用於兩個指針的差異,因此它也可以公開該信息,而不是使stddef.h重復所有相同的邏輯。

(您引用的GCC文檔非常清楚,只要您閱讀整個段落:

這些宏被定義為[一堆標准指定的typedef名稱]的正確底層類型。 它們的存在使標准頭文件stddef.hstdint.hwchar.h正常工作。 你不應該直接使用這些宏; 相反,包括適當的標頭並使用typedef。

強調我的。)

暫無
暫無

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

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