Forum: Compiler & IDEs C/C++: Alle Funktionen auflisten


von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Hallo Forum,

für dokumentarische Zwecke (arbeit) suche ich nach einer Möglichkeit, 
alle Funktionen einer C/C++ Datei (also die dort implementierten) 
automatisiert (Python) aufzulisten. Mit nm bekomme ich aus den 
Objektdateien fast alle Funktionen, aber static/inline Funktionen 
fehlen, logischer Weise. Diese sollen aber mit aufgelistet werden. Die 
Funktionen stehen im Map-File, aber das Map-File zu parsen ist nicht 
unerheblicher Aufwand.
Habt ihr vielleicht eine Idee?

Grüße

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Doxygen oder clangd

von N. M. (mani)


Lesenswert?

Μαtthias W. schrieb:
> Doxygen

Hätte ich auch als erstes versucht.
XML Output und dann sollte das relativ leicht parsbar sein in Python.

Ansonsten scheint es auch Header Parser zu geben:
https://cppheaderparser.readthedocs.io/en/stable/api.html

: Bearbeitet durch User
von db8fs (Gast)


Lesenswert?

Kaj G. schrieb:
> für dokumentarische Zwecke (arbeit) suche ich nach einer Möglichkeit,
> alle Funktionen einer C/C++ Datei (also die dort implementierten)
> automatisiert (Python) aufzulisten. Mit nm bekomme ich aus den
> Objektdateien fast alle Funktionen, aber static/inline Funktionen
> fehlen, logischer Weise.

static-Symbole sollte bei nm aber mit drin sein. Wenns inline unbedingt 
bedürfen soll (wofür auch immer), musste halt entweder den Code parsen 
(für C99 gibts nen pycparser oder so), oder eben über 
Mapfiles/Debug-Symboldaten gehen (pdb).

> Diese sollen aber mit aufgelistet werden. Die
> Funktionen stehen im Map-File, aber das Map-File zu parsen ist nicht
> unerheblicher Aufwand.

Ich würds erstmal per Shell versuchen zu parsen (grep/sed), wenn's zu 
kompliziert wird für Python, merkt mer das dann recht schnell.

Persönlich würd ich empfehlen, die inlines zu knicken und darauf zu 
verzichten - lohnt imho den Aufwand nicht ggü. der nm-basierten Lösung.

von Alexander S. (alesi)


Lesenswert?

Kaj G. schrieb:
> für dokumentarische Zwecke (arbeit) suche ich nach einer Möglichkeit,
> alle Funktionen einer C/C++ Datei (also die dort implementierten)
> automatisiert (Python) aufzulisten.

Dazu fallen mir die ctags von vim ein. Siehe z.B. 
https://kulkarniamit.github.io/whatwhyhow/howto/use-vim-ctags.html
oder http://ctags.sourceforge.net/whatis.html oder 
https://linux.die.net/man/1/ctags
Die tag Datei sollte die Infos enthalten, ich habe aber gerade kein 
Beispiel zur Hand.

von Klummel (Gast)


Lesenswert?

Beachte: durch Preprozessor Mechanismen können Funktionen 
aktiviert/deaktiviert werden. Daher statt grep Tools eher Tools nutzen 
die Preprozessor Befehle verstehen, z. B. Doxygen...

von Chris (Gast)


Lesenswert?

Cproto funktioniert, ist aber c , kein  Python

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Alexander S. schrieb:
> Dazu fallen mir die ctags von vim ein. Siehe z.B.
> https://kulkarniamit.github.io/whatwhyhow/howto/use-vim-ctags.html
> oder http://ctags.sourceforge.net/whatis.html oder
> https://linux.die.net/man/1/ctags
> Die tag Datei sollte die Infos enthalten, ich habe aber gerade kein
> Beispiel zur Hand.

Besser: Universal Ctags (https://github.com/universal-ctags/ctags)
Das wird auch aktuell gehalten. Einfache Kommandzeile (ggf anpassen):
1
find . -name \*.cc | xargs ctags --kinds-c++=f

Das Ergebnis steht in der Datei tags.

von grundschüler (Gast)


Lesenswert?

Kaj G. schrieb:
> alle Funktionen einer C/C++ Datei (also die dort implementierten)
> automatisiert (Python) aufzulisten.

in meiner ide habe ich das so gelöst:
1
    private void sub_functiond_find(string searchtext1, string searchtext2, Color col)
2
    {
3
      searchtext1 = "{";
4
      searchtext2 = "}";
5
      string text = TextArea.Text;
6
      listBox2.Items.Clear();
7
      // text = text.Replace("){", ")\n{");
8
9
10
      //text = text.Replace(") {", ")\n{");
11
12
13
14
15
16
17
      // text = text.Replace("\n\n{", ")\n{");
18
      // text = text.Replace("\n\n{", ")\n{");
19
      StringBuilder sb = new StringBuilder();
20
      string[] splitStrings = { "\r\n", "\r", "\n" };
21
      string[] lines = text.Split(splitStrings, StringSplitOptions.None);
22
      int lineCounter = 0, stufe = 0, stufe_alt=8;
23
      string line_alt = "", funktion="";
24
      foreach (string s in lines)
25
      {
26
27
        if (s.IndexOf("{") > -1 && s.IndexOf("}") == -1)
28
        {
29
          if (s.IndexOf("//") > s.IndexOf("{") || s.IndexOf("//") == -1)
30
          {
31
            stufe++;//start funktion
32
          }
33
34
        }
35
36
        if (s.IndexOf("}") > -1 && s.IndexOf("{") == -1)
37
        {
38
          if (s.IndexOf("//") > s.IndexOf("}") || s.IndexOf("//") == -1)
39
          {
40
            stufe--;//start funktion
41
          }
42
        }
43
44
45
46
47
        if(stufe==1 && stufe_alt == 0)
48
                {
49
          for (int i = 0; i < 5; i++) 
50
          {
51
            if (lines[lineCounter-i].IndexOf(')') > -1)
52
            { 
53
            funktion = lines[lineCounter - i].Substring(0, lines[lineCounter - i].IndexOf(')') + 1);
54
              listBox2.Items.Add((lineCounter - i+1).ToString()+"_"+ funktion);
55
              break;
56
            }
57
58
          }
59
60
61
        }
62
        stufe_alt = stufe;
63
        //line_alt = s;
64
65
66
67
68
69
        sb.Append("/*" + lineCounter.ToString().PadLeft(4, '_') + "_" + stufe.ToString() + "_*/");
70
        sb.Append("\t");
71
        sb.Append(s);
72
        sb.Append(Environment.NewLine);
73
        lineCounter++;
74
      }
75
}


Es werden jeweils die Ebenen geschweifter Klammern festgestellt. Auf der 
untersten Ebene stehen geschweifte Klammern vor Funktionen. Die werden 
dann festgestellt und aufgelistet. Kompliziert - aber funktioniert.

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
Noch kein Account? Hier anmelden.