Ctags: C: Tidak dapat mengurai fungsi setelah garis makro

Dibuat pada 21 Des 2014  ·  8Komentar  ·  Sumber: universal-ctags/ctags

Halo,
Saya menemukan bug dalam penguraian C menggunakan ctags (juga ada di ctags riang).

Masalahnya adalah sebagai berikut:

#include <stdio.h>

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

void main(void) {
    foo();
}

Output dari file ctags tidak memiliki fungsi foo() seperti di bawah ini.

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

Terima kasih!!

Parser buenhancement

Komentar yang paling membantu

Saya tidak tahu triknya tetapi parse baru menyelesaikan ini.
Saya mendapatkan:

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

Semua 8 komentar

Terima kasih telah melaporkan.
Penting tetapi memperbaikinya tidak mudah.

Catatan pribadi: Kita harus merekam definisi makro dalam directiveDefine dari get.c
lapisan gabus saya bekerja di cabang dapat digunakan. Aliran input harus diretas.
Saya harus memeriksa aliran input berbasis memori geany.

@masatake
Apakah Anda membuat kemajuan dalam hal ini?
Apakah cabang Anda tersedia di suatu tempat?

Tidak. Saya tidak melakukan apa pun tentang topik ini.

Mungkin Anda bisa menggunakan ctags -I 'PRAGMA+' untuk melewati bagian ekspansi makro.

Catatan pribadi: Kita harus merekam definisi makro di directiveDefine dari get.c cork layer

Ini tidak akan cukup untuk menyelesaikan semua penggunaan makro, karena banyak yang bisa berasal dari header yang disertakan, dan meluas ke hal-hal aneh, jadi tanpa preprosesor C yang lengkap, itu tidak akan pernah sempurna. Jadi saya bertanya-tanya apakah masuk akal untuk menambahkan semua kerumitan yang diperlukan untuk melacak ekspansi makro jika itu tidak akan pernah cukup.

@b4n , saya setuju.

Saya tidak tahu triknya tetapi parse baru menyelesaikan ini.
Saya mendapatkan:

PRAGMA  /tmp/enum.c /^#define PRAGMA(/;"    d   file:
foo /tmp/enum.c /^int foo() {$/;"   f
main    /tmp/enum.c /^void main(void) {$/;" f
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

cweagans picture cweagans  ·  4Komentar

sparkcanon picture sparkcanon  ·  3Komentar

cweagans picture cweagans  ·  8Komentar

jayceekay picture jayceekay  ·  13Komentar

EvanCarroll picture EvanCarroll  ·  14Komentar