こんにちは、
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
ありがとう!!
ご報告ありがとうございます。
重要ですが、これを修正するのは簡単ではありません。
プライベート ノート: 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
最も参考になるコメント
私はそのトリックを知りませんが、新しい解析はこれを解決します。
私は得た: