C/C++: Alle Funktionen auflisten

OP (Firma: RUB) #7104493
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
Gast #7104525
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.
#7104564
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.
Persönliche Seite #7106017
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.
Gast #7109296
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren