Ctags: C : Funktion nach Makrozeile kann nicht geparst werden

Erstellt am 21. Dez. 2014  ·  8Kommentare  ·  Quelle: universal-ctags/ctags

Hallo,
Ich habe einen Fehler beim Parsen von C mit Ctags gefunden (es ist auch in exuberant-ctags).

Das Problem ist folgendes:

#include <stdio.h>

#define PRAGMA(x) _Pragma(#x)
PRAGMA(bar)
int foo() {
    int a = 1;
    printf("a = %d\n", a);
}

void main(void) {
    foo();
}

Die Ausgabe der ctags-Datei hatte keine Funktion foo() wie unten beschrieben.

PRAGMA  f.c /^#define PRAGMA(/;"    d   file:
PRAGMA  f.c /^PRAGMA(bar)$/;"   f
main    f.c /^void main(void) {$/;" f

Vielen Dank!!

Parser buenhancement

Hilfreichster Kommentar

Ich kenne den Trick nicht, aber die neue Analyse löst dies.
Ich habe:

PRAGMA  /tmp/enum.c /^#define PRAGMA(/;"    d   file:
foo /tmp/enum.c /^int foo() {$/;"   f
main    /tmp/enum.c /^void main(void) {$/;" f

Alle 8 Kommentare

Vielen Dank für die Berichterstattung.
Wichtig, aber dies zu beheben ist nicht einfach.

Private Anmerkung: Wir müssen die Makrodefinition in der DirectiveDefine von get.c aufzeichnen
Korkschicht, die ich in einer Filiale arbeite, kann verwendet werden. Eingabestream muss gehackt werden.
Ich muss den speicherbasierten Eingabestream von Geany überprüfen.

@masatake
Haben Sie diesbezüglich Fortschritte gemacht?
Ist Ihre Filiale irgendwo erreichbar?

Nein, ich tue nichts zu diesem Thema.

Vielleicht könnten Sie ctags -I 'PRAGMA+' , um die Makroerweiterung zu überspringen.

Privater Hinweis: Wir müssen die Makrodefinition in der DirectiveDefine von get.c cork layer aufzeichnen

Dies wird nicht ausreichen, um alle Makroanwendungen zu lösen, da viele von enthaltenen Headern stammen und sich zu seltsamen Dingen erweitern können, sodass es ohne einen ausgewachsenen C-Präprozessor nie perfekt sein wird. Daher frage ich mich, ob es sinnvoll ist, die gesamte Komplexität hinzuzufügen, die erforderlich ist, um die Makroerweiterung zu verfolgen, wenn dies nie ausreicht.

@b4n , ich stimme zu.

Ich kenne den Trick nicht, aber die neue Analyse löst dies.
Ich habe:

PRAGMA  /tmp/enum.c /^#define PRAGMA(/;"    d   file:
foo /tmp/enum.c /^int foo() {$/;"   f
main    /tmp/enum.c /^void main(void) {$/;" f
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen