2017-07-04 132 views
0

我想弄清楚各種頭文件中的整型定義是如何相互關聯的。如何使用GNU C預處理器預定義的宏?

我剛安裝了CygWin。我打開了Cygwin\x86\usr\include\machine\_default_types.h。在它我注意到下面的代碼片斷:

#ifdef __INT8_TYPE__ 
typedef __INT8_TYPE__ __int8_t; 

根據here,所述__INT8_TYPE__是預定義的預處理器宏之一。和:

你不應該直接使用這些宏;相反,請包含 適當的標題並使用typedefs。如果GCC在這些系統上未提供stdint.h 標頭,則可能會在特定系統上定義這些宏中的某些宏。

所以看來__INT8_TYPE__應該在其他地方定義。但是我搜索了整個CygWin的安裝,沒有定義它。我發現的一切都是像上面那樣的一些條件性陳述。

因爲我不應該直接使用它。沒有其他文件正在定義它。這個宏如何能夠實施?還是我誤解了一些東西?

回答

4

這是一個預定義的宏。看到他們,你可以:

gcc -dM -E - < /dev/null 

例如爲:

$ gcc -dM -E - < /dev/null | grep __INT 
#define __INTMAX_C(c) C## L 
#define __INT8_C(c) c 
#define __INT64_C(c) C## L 
#define __INT32_MAX__ 0x7fffffff 
#define __INT_FAST32_MAX__ 0x7fffffffffffffffL 
#define __INT_FAST16_TYPE__ long int 
#define __INT_LEAST32_MAX__ 0x7fffffff 
#define __INT_FAST64_TYPE__ long int 
#define __INT32_C(c) c 
#define __INT_FAST32_TYPE__ long int 
#define __INT16_MAX__ 0x7fff 
#define __INT8_TYPE__ signed char 
#define __INT_LEAST16_TYPE__ short int 
#define __INT_FAST16_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST16_MAX__ 0x7fff 
#define __INT64_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST64_TYPE__ long int 
#define __INT16_TYPE__ short int 
#define __INT_LEAST8_TYPE__ signed char 
#define __INT_FAST8_MAX__ 0x7f 
#define __INTPTR_MAX__ 0x7fffffffffffffffL 
#define __INTPTR_TYPE__ long int 
#define __INT_FAST64_MAX__ 0x7fffffffffffffffL 
#define __INT_MAX__ 0x7fffffff 
#define __INT64_TYPE__ long int 
#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL 
#define __INT_LEAST8_MAX__ 0x7f 
#define __INT_LEAST32_TYPE__ int 
#define __INT_FAST8_TYPE__ signed char 
#define __INTMAX_MAX__ 0x7fffffffffffffffL 
#define __INT8_MAX__ 0x7f 
#define __INT32_TYPE__ int 
#define __INTMAX_TYPE__ long int 
#define __INT16_C(c) c 
+1

所以...它是內置到編譯器爲特定平臺,我不能改變呢? – smwikipedia

+0

@smwikipedia它們絕對是平臺和編譯器特有的。這很可能是不可修改的。 – ldav1s

+1

我真的應該說「不可修改」的是這些宏是[保留標識符](http://en.cppreference.com/w/c/language/identifier#Reserved_identifiers),不應該由一個程序(UB)。你可以避開它,但是當你鏈接到另一個庫(例如'libc')時,你重新定義的'int8_t'不會匹配'libc'的'int8_t'的大小和/或符號(除非它是一個微不足道的重新定義 - 但這有什麼意義?),所以各種有趣的破壞會隨之而來。 – ldav1s