Warnungen mit -Wextra und -pedantic
-
// ist perfektes C99. Aber wenn du dem Compiler das nicht sagst, geht er eben davon aus, dass du C89 schreiben möchtest und meckert.
-
Ich bevorzuge auch "// ...", aber wenn man -ansi will, dann ist muss man eben "/* ... */" nehmen.
Wobei ANSI wohl "C90" entspricht und damit ein älterer Standard als C99 ist. Also ich an eurer Stelle würde die Kommentare so lassen und -std=c99 oder -std=gnu99 nehmen, immerhin ist C99 inzwischen auch schon zehn Jahre alt - wenn es auch nicht komplett umgesetzt ist, so müssten doch zumindest die Zeilenkommentare ("//") in allen Compilern drin sein, die C99 zumindest ansatzweise unterstützen.
-
edit: ich hab nichts gesagt^^
-
Danke für den Tipp. Denn da ich die C++-Kommentare nicht als schädlich erachte, also -std=gnu99 anstelle -ansi. OK?
Daraus folgt:
Muss: -std=gnu99 -Werror -Wall
Ziel1: -Wextra
Ziel2: -pedanticCFLAGS= -std=gnu99 -Werror -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin -fno-stack-protector -Iinclude
Läuft beim Kernel fehlerfrei durch.
Akzeptiert?
Bezüglich c99 (vs. gnu99) wird folgender Fehler angezeigt:
i586-elf-gcc -std=c99 -Werror -Wall -O -ffreestanding -fleading-underscore -nost dlib -nostdinc -fno-builtin -fno-stack-protector -Iinclude -c -o isrs.o isrs.c isrs.c: In function 'fault_handler': isrs.c:97: error: 'asm' undeclared (first use in this function) isrs.c:97: error: (Each undeclared identifier is reported only once isrs.c:97: error: for each function it appears in.) isrs.c:97: error: expected ';' before 'volatile' mingw32-make: *** [isrs.o] Error 1
-
Das Schlüsselwort asm gibt es in c99 nicht, sondern ist eine GNU Extension. __asm__ sollte bei beiden gehen.
-
Nach Austausch aller asm gegen __asm__ läuft im Kernel auch -std=c99 glatt durch.
Daher können wir problemlos nach der Linie
Muss: -std=c99 -Werror -Wall
Ziel1: -Wextra
Ziel2: -pedanticverfahren.
Was beinhaltet -Wextra genau?
-
Erhard Henkes schrieb:
Was beinhaltet -Wextra genau?
Von http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-Wextra
This enables some extra warning flags that are not enabled by -Wall. (This option used to be called -W. The older name is still supported, but the newer name is more descriptive.)-Wclobbered
-Wempty-body
-Wignored-qualifiers
-Wmissing-field-initializers
-Wmissing-parameter-type (C only)
-Wold-style-declaration (C only)
-Woverride-init
-Wsign-compare
-Wtype-limits
-Wuninitialized
-Wunused-parameter (only with -Wunused or -Wall)Die meisten sind auf der Seite auch erklärt. Zusammen mit -Werror sind da welche bei, die ich während des Programmierens recht nervig finde. So sorgt -Wunused-parameter für Fehler wenn in einer Funktion nicht jeder Parameter verwendet wurde. Gerade wenn man temporär eine Funktion schreibt, die noch nicht den vollen Funktionsumfang hat, stößt man da oft drauf.
-
Ich finde alle Schalter -Wall -Wextra -Werror -pedantic ok. Man muss sich nur auf ein -std= einigen. Und ich würde c89 bevorzugen. Meine Argumente dafür wären:
- Kommentare mit // in C-Programmen sind ein Dorn im Auge
- Warnungen wie "Fehler: ISO-C90 verbietet gemischte Deklarationen und Code" bedeuten, der Programmierer weiss nicht, wie viele lokale Variablen in der Funktion verwendet werden. Pi mal Daumen Regel sagt, maximal sieben lokale Variablen...
- Alle Compiler heutzutage können c89 - bedeutet u.a. "bessere" Portabilität des Codes (unter Windows z.B. wird portabilität klein geschrieben ;), Windows läuft ja nur auf x86 ab Pentium II oder so, Linux z.B. läuft auf alpha, arm, avr32, blackfin, cris, frv, h8300, i386, ia64, m32r, m68k, m68knommu, microblaze, mips, mn10300, parisc, powerpc, s390, sh, sparc, um, x86, xtensa, ich gebe zu, habe bloss linux/arch Inhalt wiedergegeben, aber man scheint unter Linux irgendwas doch anders zu machen, als unter Windows...)Ansonsten - egal, Hauptsache, alle einigen sich auf einen -std= Schalter
-
Kommentare mit // in C-Programmen sind ein Dorn im Auge
Einem C++-Programmierer fällt das überhaupt nicht negativ auf. C99 ist vor allem modernes C:
Mit C99 flossen einige aus C++ bekannte Erweiterungen in die Sprache C ein, zum Beispiel das Schlüsselwort inline und die Möglichkeit, Variablen innerhalb der for-Anweisung zu deklarieren.
Die Deklaration innerhalb der for-Schleife würde ich auch sehr begrüßen. Das ist wirklich sinnvoll! Daher bitte ich um Zustimmung für -std=c99.
http://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C#C99
-
Erhard Henkes schrieb:
Die Deklaration innerhalb der for-Schleife würde ich auch sehr begrüßen. Das ist wirklich sinnvoll!
Ich weiss nicht, ob es sinnvoll ist. Dieses "Feature" hat ja, glaube ich, dazu geführt, dass Code, der z.B. unter MSVS sauber kompiliert, unter anderen Compilern aber nicht, weil unter MSVS konnten/können(?) die Variablen, die in for() deklariert wurden, ausserhalb der for() Schleife doch benützt werden (was ja nicht erlaubt ist)...
-
abc.w schrieb:
Erhard Henkes schrieb:
Die Deklaration innerhalb der for-Schleife würde ich auch sehr begrüßen. Das ist wirklich sinnvoll!
Ich weiss nicht, ob es sinnvoll ist. Dieses "Feature" hat ja, glaube ich, dazu geführt, dass Code, der z.B. unter MSVS sauber kompiliert, unter anderen Compilern aber nicht, weil unter MSVS konnten/können(?) die Variablen, die in for() deklariert wurden, ausserhalb der for() Schleife doch benützt werden (was ja nicht erlaubt ist)...
MSVC ist inzwischen repariert.
Und vorher haben wir uns immer beholfen mit dem Bugfix#define for if(false){}else for
-
Was ist eigentlich der Unterschied zwischen "c99" und "gnu99"?
-
Badestrand schrieb:
Was ist eigentlich der Unterschied zwischen "c99" und "gnu99"?
gnuXX ist cXX + GNU Extensions. Die GNU Extensions stehen auf http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
-
Ich musste beispielsweise "asm" in "__asm__" umwandeln, damit C99 erfüllt wird, weil nur GNU asm verwendet.
-
Gibt es eine vergleichende Übersicht für ansi, C99 u. GNU?