Hallo, Ich bin auf der Suche nach einem Programm oder Skript oder ähnlichem, was mir zu gegebenen C-Sourcecode Dateien eine Auflistung von allen Variablen und Funktionen etc. mit Typ und Name erstellt. Das Ergebnis sollte auch Informationen wie Gültigkeitsbereich etc. liefern, ungefähr so irgendwie: ganzeZahl int local variable ganzeGlobaleZahl int global variable funcReturnsChar char local function pointerToFloat float* local variable Einige Entwicklungsumgebungen, wie Eclipse z.B. bieten ja solche Navigator-Fenster, die ungefähr diese Informationen anzeigen, aber meistens kann man diese nicht in eine Textdatei oder sowas exportieren. Kennt jemand ein Tool, mit dem das geht? Außerdem müssten doch die Parser von C-Compilern auch sowas ähnliches erstellen, gibt es vielleicht einen Parser, der mir sowas ausspuckt? Doxygen erfüllt die Anforderungen ja fast mit dem xml-Export. Leider werden da nicht alle lokalen Variablen, also Stack-Variablen angezeigt. Kann man das irgendwie umkonfigurieren, so dass wirklich ALLE Variablen aufgelistet werden? mfg, Chris
Danke für die Antworten erstmal. Wie ich Cscope für die Aufgabe einsetzen soll konnte ich mir bis jetzt noch nicht erschließen, könntest du das ein bisschen näher erläutern? Ctags dagegen sieht ja schonmal ganz gut aus, was da rauskommt =) Allerdings werden dort scheinbar leider auch nicht die Variablen, die innerhalb von Funktionen genutzt werden, aufgelistet... An Doxygen hab auch bereits gedacht, wie im ersten Post steht, aber dort ist das Problem das gleiche wie bei Ctags.
Ich schon wieder... ^^ Also ctags löst die Aufgabe schon ganz gut, man kann es auch so konfigurieren, dass auch lokale Variablen angezeigt werden. Einzig die Variablen in Funktionsschnittstellen zeigt das Tool nicht an. Habe bereits das manual durchsucht aber scheinbar gibt es keine Option dafür. Kennt jemand nen Trick wie man ctags dazu bringt es doch zu tun? Oder kennt jemand vll noch ein anderes, besseres Tool?
hallo, komischerweise zeigt mir ctags bei diesem (vereinfachten) Beispiel an, dass beide Funktionen file scope hätten, d.h. nur in diesem Sourcefile bekannt seien.
1 | void func(); |
2 | static void func2(); |
3 | |
4 | |
5 | void func() |
6 | { |
7 | |
8 | } |
9 | |
10 | void func2() |
11 | { |
12 | |
13 | } |
Die Ausgabe von ctags:
1 | func test_func.c /^void func();$/;" p line:1 file: |
2 | func2 test_func.c /^static void func2();$/;" p line:2 file: |
3 | func test_func.c /^void func()$/;" f line:5 |
4 | func2 test_func.c /^void func2()$/;" f line:10 |
Man sieht, dass die Prototypen mit scope "file" erkannt werden, die Definitionen dann aber nicht (also global). Allerdings passiert das nur, wenn ich den code in einer *.c Datei speichere. Speichere ich ihn in einer *.h Datei sieht das Ergebnis anders aus:
1 | func test_func.h /^void func();$/;" p line:1 |
2 | func2 test_func.h /^static void func2();$/;" p line:2 |
3 | func test_func.h /^void func()$/;" f line:5 |
4 | func2 test_func.h /^void func2()$/;" f line:10 |
Jetzt werden beide Funktionen als global erkannt, obwohl die eine mit "static" ja nur in dieser Datei sichtbar wäre, also eigentlich das "file" Attribut haben müsste... Jetzt die Frage, hab ich nen Bug entdeckt oder übersehe ich irgendwas und das Programm arbeitet einwandfrei?
Sofern es keine Funktionsprototypen in einer Headerdatei gibt, sind die Funktionen tatsächlich nur im "file scope" definiert, allerdings gibt es "Zusammenstöße" auf Linkerebene, wenn mehrere solche Sourcemodule als nicht-statisch verwendete gleiche Symbolnamen verwenden. Das Schlüsselwort static hat eigentlich nichts in einer Headerdatei verloren.
Danke für die Antwort! Versteh das aber nicht so ganz, ich dachte immer wenn eine Funktion ohne static deklariert wird, ist sie global sichtbar, auch ganz ohne Headerdatei. Hab jetzt im manual versteckt nen Hinweis auf die Sache gefunden: [quote]Any tag which is located in a non-include file and cannot be seen (e.g. linked to) from another file is considered to have file-limited (e.g. static) scope. No kind of tag appearing in an include file will be considered to have file-limited scope.[/quote] Die Funktion func() in meinem Beispiel ist aber doch auch für andere Dateien sichtbar. Habs einfach mal probiert mit
1 | // main.c |
2 | int main() |
3 | { |
4 | func(); |
5 | func2(); |
6 | return 0; |
7 | } |
und mit
1 | gcc main.c func.c |
bekomm ich nur den Fehler für func2():
1 | F:\DATEN>gcc main.c test_func.c |
2 | /cygdrive/c/DOKUME~1/ENTWSO~1/LOKALE~1/Temp/cc4dXpRp.o:main.c:(.text+0x30): undefined reference to `_func2' |
3 | collect2: ld returned 1 exit status |
ohne den Aufruf von func2() kompilierts und läufts einwandfrei.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.