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

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.