Advanced Java Services | Eclipse CDT FAQ |
Eine alphabetische Liste von hoffentlich nützlichen Tips, die immer wieder mal erweitert wird.
Run -> Run Configurations... -> Tab Arguments aktivieren -> Argumente in das Textfeld "Program arguments" eintragen.
Zeilen markieren -> CTRL SHIFT /
Automatisches Speichern vor einem Build oder Run ist nicht voreingestellt. So ändert man das:
Window -> Preferences -> Run/Debug -> Launching
Radiobutton bei "Save required dirty editors before launching" setzen.
Project -> Properties -> C/C++ Build -> Settings -> GCC C Compiler -> Miscellaneus
Hier kann man zusätzliche Flags setzen. Die c99-Einstellungen errreicht man mit (irgend)einem der
folgenden Flags: -posix oder -D__USE_MINGW_ANSI_STDIO oder -std=c99.
Dann kann man neuere Datentypen wie etwa "long long" einlesen und ausgeben.
Eclipse bietet vier verschiedene Stile an, K&R (Kernighan&Ritchie), BSD, GNU und Whitesmiths. Auf der Grundlage eines der eingebauten Codestyles kann man auch einen eigenen entwerfen. Das geht ganz anaolg wie in Eclipse-Java.
Window -> Preferences -> C/C++ -> Code Style
Unter "Select a profile" kann man einen der vier Code Styles auswählen, mit "Edit" editieren oder mit "New" einen neuen entwerfen.
Der Codestyle wird als xml-Datei exportiert (gespeichert).
Window -> Preferences -> C/C++ -> Code Style -> Formatter -> Edit -> Export
Window -> Preferences -> C/C++ -> Code Style -> Import
Datei oder Projektnamen im Package Explorer markieren -> F2
Beim Umbenennen eines Projekts wird nur das Verzeichnis umbenannt. Ebenso beim Umbenennen von Dateien. Einträge in davon abhängigen Dateien werden also nicht geändert, hier muß. man von Hand umbenennen.
Wenn "gcc" deutsche Fehlermeldungen ausgibt, kann das zu Problemen führen da Eclipse/CDT nur englische Meldungen parsen kann. So können etwa aus Warnings dann Errors werden, was recht unangenehm sein kann. So führt etwa eine Zuweisung eines unsigned int auf ein int zu einer Fehlermeldung. Man kann das wie folgt abstellen:
Project -> Properties -> C/C++ Buils -> Environment
Hier geht man auf den Add-Button und trägt eines neues key/value Paar (LC_MESSAGES/en_US) ein.
Man kann F3 auch für die Funktionen und Makros aus den Headerdateien verwenden. Eclipse sucht dann die Deklaration in der zugehörigen Headerdatei. Es funktioniert übrigens auch mit den selbstgeschriebenen Headern.
Markieren des Funktionsnamen im Editor -> F3
Es kann sehr hilfreich sein, einen Blick in die Headerdateien zu werfen- Das Tastenkürzel ist sehr einfach. Es funktioniert übrigens auch mit den selbstgeschriebenen Headern.
Markieren der Headerdatei im Editor -> F3
Project -> Properties -> C/C++ Build -> Settings -> GCC C Compiler -> Includes
Hier auf das kleine grüne +-Symbol neben dem Text Include paths (-I) klicken. Man erhält einen kleinen Dialog mit dem man das Verzeichnis der Headerdatei angeben kann.
Project -> Properties -> C/C++ Build -> Settings -> MinGW C Linker -> Miscellaneous
Hier auf das kleine grüne +-Symbol neben dem Text Include paths (-I) klicken. Man erhält einen kleinen Dialog mit dem man die Datei eintragen kann. Man kann Sourcedateien und Objectdateien eintragen.
Beim Umbenennen oder Löschen von Projekten aktualisiert Eclipse CDT die Launch Configuration nicht oder nur unvollständig. Zu jeder Launch Konfiguration gehört eine xml-Datei im Verzeichnis
<eclipse workspace>/.metadata/.plugins/org.eclipse.debug.core/.launches
Sie trägt den Namen des Projekts, also etwa "MyProject Debug.launch". Man kann sie gefahrlos löschen und legt dann über Eclipse eine neue Launch Konfiguration an.
When ein Build nicht funktioniert so kann das mehrere Ursachen haben. Meistens hat noch Fehler im Programm. Aber auch wenn das Programm fehlerfrei ist kann ein Build schiefgehen. Z. Bsp. wenn in der Fehlermeldung sinngemäß die folgende Zeile auftritt.
c:/mingw/bin/... .../mingw32/bin/ld.exe: cannot open output file foo.exe: Permission denied
In diesem Fall läuft das Programm noch und der Linker kann keine neue exe-Datei erzeugen. Man kann dann das Programm mit dem kleinen roten quadratischen Button beenden, der sich im Konsolfenster unterhalb des Codefenster auf der rechten Seite befindet. Es kann allerdings vorkommen, daß das Programm läuft und obwohl kein roter Button zum Beenden angezeigt wird. In diesem Fall öffnet man den Windows Task Manager und sucht nach dem entsprechenden Programm.
Eclipse hat eine Rechtschreibprüfung, die in der Grundeinstellung eingeschaltet ist. Dann werden unbekannte Wörter rot unterringelt. Das kann nützlich sein, ist aber meist eher störend. So schaltet man sie ab:
Window -> Preferences -> General -> Editors -> Text Editors -> Spelling -> [ ] Enable spell checking (aushaken)
Das folgende kleine Programm läuft nicht so wie erwartet.
#include <stdio.h> #include <stdlib.h> int main(void) { puts("Hello World"); /* prints Hello World */ printf("Zahl eingeben: "); int zahl; scanf("%d", &zahl); printf("Die Zahl: %d", zahl); return EXIT_SUCCESS; }
Die Konsole bleibt leer. Am kleinen roten Quadradt sieht man allerdings, daß das Programm noch läuft!
Erhält das Konsolfenster den Fokus, so kann man eine Eingabe machen und erhält dann folgendes Ergebnis
Die Nachbildung (Emulation) der Windowskonsole von Eclipse für C/C++ hat noch einen Fehler. Eclipse kann unter Windows den Ausgabepuffer (also stdout und stderr) nicht löschen, sobald ein Programm auch Eingaben über die Konsole anbietet.
Es gibt zwei Möglichkeiten, diesen Fehler zu beheben. Entweder man leert den Tastaturpuffer mit einer entsprechenden Anweisung nach jeder Ausgabe oder man setzt ein generelles Statement am Anfang von main. Natürlich ist die letztere Lösung die einfachere.
Die Kommandos zum Löschen der Puffer von stdout, stderr und stdin lauten. Sowieso muß man in C nach einer Eingabe den Eingabepuffer selbst löschen, da bei einer falschen Eingabe die Zeichen im Tastaturpuffer hängenbleiben und bei der nächsten Eingabe zu unerwarteten Ergebnissen führen können.
fflush(stdout) fflush(stderr) fflush(stdin)
Hier bieten sich Makros mit define an, etwa:
#define FLI fflush(stdin) #define FLE fflush(stderr) #define FLO fflush(stdout)
Das Programm sieht nun so aus.
#include <stdio.h> #include <stdlib.h> #define FLI fflush(stdin) #define FLO fflush(stdout) int main(void) { puts("Hello World"); /* prints Hello World */ printf("Zahl eingeben: "); FLO; // muß vor scanf abgesetzt werden ! int zahl; scanf("%d", &zahl); FLI; printf("Die Zahl: %d", zahl); return EXIT_SUCCESS; }
Schöner ist eine generelle Lösung. Mit Hilfe der Funktion setbuf() oder setvbuf() läßt sich der Ausgabepuffer auf 0 setzen. Damit wird jede Ausgabe sofort nach stdout oder stderr geschrieben.
setbuf(stdout, NULL); setbuf(stderr, NULL);
Identisch hierzu ist
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0)
Beide Funktionen werden in stdio.h deklariert, siehe etwa en.cppreference.com/w/c/io/setbuf
Hier bietet sich wieder ein Makros an, etwa:
#define SETBUF setbuf(stdout, NULL); setbuf(stderr, NULL)
Damit sieht unser Programm nun so aus.
#include <stdio.h> #include <stdlib.h> #define FLI fflush(stdin) #define SETBUF setbuf(stdout, NULL); setbuf(stderr, NULL) int main(void) { SETBUF; puts("Hello World"); printf("Zahl eingeben: "); int zahl; scanf("%d", &zahl); FLI; printf("Die Zahl: %d", zahl); return EXIT_SUCCESS; }
Eclipse arbeitet mit einer Voreingestellten Zeilenlänge von 80 Buchstaben. Das ist für heutige Bildschirmauflösungen wenig. Besonders beim Nachformatieren von Code mit Hilfe von CTRL+SHIFT+F kommt es dabei zu unerwünschten Zeilenumbrüchen. Dies Einstellung kann man folgendermaßen ändern.
Window -> Preferences -> Code Style -> Edit (Button)
In dem jetzt erscheinenden Dialog aktiviert man das Tab Line Wrapping und trägt die gewünschte Zeilenlänge ein.