2010-09-22 4 views
23

Dieser Code kompiliert nicht für mich auf gcc Version 4.3.2 (Debian 4.3.2-1.1)ist "unix" eingeschränktes Schlüsselwort in C?

main(){ 
    int unix; 
} 

Ich habe die C keywords Liste überprüft und "Unix" ist nicht einer von ihnen. Warum erhalte ich den folgenden Fehler?

unix.c:2: error: expected identifier or ‘(’ before numeric constant 

Jeder?

Antwort

24

unix ist kein durch den Standard reservierter Bezeichner.

Wenn Sie mit -std=c89 oder -std=c99 kompilieren, akzeptiert der GCC-Compiler das Programm wie erwartet.

Von gcc Handbuch (https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html), ist der Schwerpunkt meiner.

... Allerdings historisch systemspezifischen Makros ohne speziellen Präfix Namen gehabt haben; zum Beispiel, ist es üblich zu finden Unix auf Unix-Systemen definiert. Für alle solcher Makros stellt GCC ein paralleles Makro mit zwei Unterstrichen bei am Anfang und am Ende hinzugefügt. Wenn Unix definiert ist, wird auch __unix__ definiert. Es wird nie mehr als zwei Unterstriche geben; Die Parallele von _mips ist __mips__.

2

Ich bin gona nehmen Sie einen wilden Stich hier und denke, dass gcc effektiv # definiert Unix als 1 auf UNIX-Systemen.

versuchen

main(){ 
    printf("%d", unix); 
} 

und sehen, was Sie erhalten.

+0

Ha! Du hast Recht: http://codepad.org/ML9VEsOa Stupid gcc. –

+1

@Steve: Siehe pmgs Antwort, um zu sehen, warum 'gcc' im Nicht-Standard-Modus dazu neigt, dieses Makro zu definieren. –

2

Ihre Frage zu beantworten, keine unix in C kein reserviertes Wort ist

Jedoch ist das Symbol unix höchstwahrscheinlich durch den Präprozessor definiert entweder, weil Sie eine Header-Datei oder weil der Compiler definiert sie.

+0

Es ist gcc, dass es tut. –

+0

Es sollte angemerkt werden, dass es ** defektes ** und nicht-konformes Verhalten für gcc ist, dies zu tun. –

11

Führen Sie den Code durch den Präprozessor, um herauszufinden, was der Compiler tatsächlich sieht:

gcc -E unix.c 

Dann sehen, ob Ihre Variable unix vom Präprozessor erhalten oder umgewandelt wird.

12

Unix einen der DEFINE ist der Präprozessor in gcc verwendet eine Liste von defs zu bekommen verwenden

gcc -dM -E -x c /dev/null 

(-dM sagt gcc die defs debugdump -E es sagt zu stop nach prepreocessing und -xc/dev/null sagt ihm zu tun,/dev/null ist ac-Datei)

+0

kürzer und einfacher: 'echo | gcc -E-dD- – mirabilos

6

Es ist kein Schlüsselwort.

Es ist ein vordefiniertes Makro, um den Systemtyp zu identifizieren. Auf Unix- und Unix-ähnlichen Systemen ist es definiert als 1.

dies die -ansi Option zu deaktivieren:

Im Modus C ist dies äquivalent = c89 -std. Im C++ - Modus entspricht dies -std = C++ 98. Dadurch werden bestimmte Funktionen von GCC deaktiviert, die mit ISO C90 (beim Kompilieren von C - Code) oder Standard C++ (beim Kompilieren von C++ - Code) wie den Schlüsselwörtern "asm" und "typeof" und vordefinierten Makros wie "unix" und "vax", die den Systemtyp identifizieren, den Sie verwenden. Es aktiviert auch die unerwünschte und selten verwendete ISO-Trigraph-Funktion. Für den C-Compiler deaktiviert es die Erkennung von // C++ // Kommentaren sowie das Schlüsselwort "inline".