2017-07-04 3 views
0

Ich versuche herauszufinden, wie die Integer-Typ-Definitionen aus verschiedenen Header-Dateien miteinander verwandt sind.Wie werden die vordefinierten Makros des GNU C-Präprozessors verwendet?

Ich habe gerade den CygWin installiert. Ich öffnete die Cygwin\x86\usr\include\machine\_default_types.h. Darin bemerkte ich unter Code-Schnipsel:

#ifdef __INT8_TYPE__ 
typedef __INT8_TYPE__ __int8_t; 

Nach here, die __INT8_TYPE__ ist eines der vordefinierten Pre-Prozessor-Makros. Und:

Sie sollten diese Makros nicht direkt verwenden; Fügen Sie stattdessen die entsprechenden Header hinzu und verwenden Sie die Typedefs. Einige dieser Makros dürfen nicht auf bestimmten Systemen definiert werden, wenn GCC auf diesen Systemen keine stdint.h -Kopfzeile bereitstellt.

So scheint es, die __INT8_TYPE__ sollte woanders definiert werden. Aber ich habe die gesamte CygWin-Installation durchsucht, es gibt keine Definition dafür. Alles, was ich gefunden habe, sind einige bedingte Aussagen wie oben.

Da sollte ich es nicht direkt verwenden. Und keine anderen Dateien definieren es. Wie könnte dieses Makro jemals in Aktion treten? Oder habe ich etwas falsch verstanden?

Antwort

4

Dies ist ein vordefiniertes Makro. Um sie sehen Sie können:

gcc -dM -E - < /dev/null 

z.B .:

$ 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

so ... wird es in den Compiler für eine bestimmte Plattform gebaut und ich kann es nicht ändern? – smwikipedia

+0

@smwikipedia Sie sind definitiv Plattform und Compiler spezifisch. Es ist wahrscheinlich, dass sie nicht modifizierbar sind. – ldav1s

+1

Was ich wirklich über "nicht veränderbar" hätte sagen sollen, ist, dass diese Makros [reservierte Identifikatoren] sind (http://en.cppreference.com/w/c/language/identifier#Reserved_identifiers) und nicht von deklariert werden sollten ein Programm (UB). Sie können zwar damit durchkommen, aber wenn Sie eine Verbindung zu einer anderen Bibliothek herstellen (zB 'libc'), wird Ihr neu definiertes' int8_t' nicht mit 'libc's' int8_t' in Größe und/oder Signedness übereinstimmen (es sei denn, es ist eine triviale Neudefinition - aber was soll das?) und so kann jede Art von Spaßbruch entstehen. – ldav1s

Verwandte Themen