Ctags: C: no se puede analizar la función después de la línea macro

Creado en 21 dic. 2014  ·  8Comentarios  ·  Fuente: universal-ctags/ctags

Hola,
Encontré un error al analizar C usando ctags (también está en exuberant-ctags).

El problema es el siguiente:

#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 salida del archivo ctags no tenía una función foo() como se muestra a continuación.

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

¡¡Gracias!!

Parser buenhancement

Comentario más útil

No conozco el truco, pero el nuevo análisis lo resuelve.
Tengo:

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

Todos 8 comentarios

Gracias por informar.
Importante, pero arreglar esto no es fácil.

Nota privada: Tenemos que registrar la definición de macro en directiveDefine de get.c
Se puede usar la capa de corcho que estoy trabajando en una rama. El flujo de entrada debe ser pirateado.
Tengo que comprobar el flujo de entrada basado en la memoria de geany.

@masatake
¿Ha progresado en esto?
¿Está su sucursal disponible en algún lugar?

No. No hago nada sobre este tema.

Quizás podría usar ctags -I 'PRAGMA+' para omitir la parte de expansión macro.

Nota privada: Tenemos que registrar la definición de macro en directiveDefine de la capa de corcho get.c

Esto no será suficiente para resolver todo el uso de macros, porque muchos pueden provenir de encabezados incluidos y expandirse a cosas extrañas, por lo que sin un preprocesador C completo nunca será perfecto. Así que me pregunto si tiene sentido agregar toda la complejidad requerida para rastrear la expansión macro si alguna vez no será suficiente.

@ b4n , estoy de acuerdo.

No conozco el truco, pero el nuevo análisis lo resuelve.
Tengo:

PRAGMA  /tmp/enum.c /^#define PRAGMA(/;"    d   file:
foo /tmp/enum.c /^int foo() {$/;"   f
main    /tmp/enum.c /^void main(void) {$/;" f
¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

jespinal picture jespinal  ·  8Comentarios

trevordmiller picture trevordmiller  ·  9Comentarios

masatake picture masatake  ·  18Comentarios

jagjordi picture jagjordi  ·  9Comentarios

cweagans picture cweagans  ·  13Comentarios