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?
so ... wird es in den Compiler für eine bestimmte Plattform gebaut und ich kann es nicht ändern? – smwikipedia
@smwikipedia Sie sind definitiv Plattform und Compiler spezifisch. Es ist wahrscheinlich, dass sie nicht modifizierbar sind. – ldav1s
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