Ctags: C : Impossible d'analyser la fonction après la ligne de macro

Créé le 21 déc. 2014  ·  8Commentaires  ·  Source: universal-ctags/ctags

Bonjour,
J'ai trouvé un bug dans l'analyse du C à l'aide de ctags (c'est aussi dans exuberant-ctags).

Le problème est le suivant:

#include <stdio.h>

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

void main(void) {
    foo();
}

La sortie du fichier ctags n'avait pas de fonction foo() comme ci-dessous.

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

Merci!!

Parser buenhancement

Commentaire le plus utile

Je ne connais pas l'astuce mais la nouvelle analyse résout ce problème.
J'ai eu:

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

Tous les 8 commentaires

Merci d'avoir signalé.
Important mais régler ce problème n'est pas facile.

Note privée : nous devons enregistrer la définition de la macro dans directiveDefine de get.c
couche de liège je travaille dans une branche peut être utilisé. Le flux d'entrée doit être piraté.
Je dois vérifier le flux d'entrée basé sur la mémoire de Geany.

@masatake
Avez-vous progressé sur ce point ?
Votre agence est-elle disponible quelque part ?

Non, je ne fais rien sur ce sujet.

Vous pourriez peut-être utiliser ctags -I 'PRAGMA+' pour ignorer la partie d'extension de macro.

Note privée : nous devons enregistrer la définition de la macro dans la directiveDefine de la couche de liège get.c

Cela ne suffira pas à résoudre toutes les utilisations des macros, car beaucoup peuvent provenir d'en-têtes inclus et s'étendre à des choses étranges, donc sans un préprocesseur C complet, ce ne sera jamais parfait. Je me demande donc s'il est logique d'ajouter toute la complexité requise pour suivre l'expansion des macros si cela ne suffira jamais.

@b4n , je suis d'accord.

Je ne connais pas l'astuce mais la nouvelle analyse résout ce problème.
J'ai eu:

PRAGMA  /tmp/enum.c /^#define PRAGMA(/;"    d   file:
foo /tmp/enum.c /^int foo() {$/;"   f
main    /tmp/enum.c /^void main(void) {$/;" f
Cette page vous a été utile?
0 / 5 - 0 notes