Ctags: C : マクロ行の後の関数を解析できません

作成日 2014年12月21日  ·  8コメント  ·  ソース: universal-ctags/ctags

こんにちは、
ctags を使用して C を解析する際にバグを見つけました (それは exuberant-ctags にも含まれています)。

問題は次のとおりです。

#include <stdio.h>

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

void main(void) {
    foo();
}

ctags ファイルの出力には、以下のようにfoo()関数がありませんでした。

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

ありがとう!!

Parser buenhancement

最も参考になるコメント

私はそのトリックを知りませんが、新しい解析はこれを解決します。
私は得た:

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

全てのコメント8件

ご報告ありがとうございます。
重要ですが、これを修正するのは簡単ではありません。

プライベート ノート: get.c のディレクティブDefine にマクロ定義を記録する必要があります
ブランチで作業しているコルク層が使用できます。 入力ストリームをハッキングする必要があります。
Geanyのメモリベースの入力ストリームを確認する必要があります。

@まさたけ
これで進展しましたか?
あなたの支店はどこかにありますか?

いいえ、このトピックについては何もしません。

おそらく、 ctags -I 'PRAGMA+'を使用してマクロ展開部分をスキップできます。

プライベート ノート: get.c コルク層の directorDefine にマクロ定義を記録する必要があります。

これは、マクロの使用法をすべて解決するには十分ではありません。多くの場合、インクルードされたヘッダーに由来し、奇妙なものに拡張される可能性があるため、本格的な C プリプロセッサがなければ、完璧にはなりません。 それで、マクロの展開を追跡するために必要なすべての複雑さを追加することは理にかなっているのだろうか.

@b4n 、同意します。

私はそのトリックを知りませんが、新しい解析はこれを解決します。
私は得た:

PRAGMA  /tmp/enum.c /^#define PRAGMA(/;"    d   file:
foo /tmp/enum.c /^int foo() {$/;"   f
main    /tmp/enum.c /^void main(void) {$/;" f
このページは役に立ちましたか?
0 / 5 - 0 評価