3

作業中のCプロジェクトのファイルctagsを生成するために使用していますが、ファイルに多くの関数がありません。tagsこれは、を使用しているためにソースファイル内の不均衡な中括弧が原因であると思われます#ifdef。(簡略化された)例:

#include <stdio.h>

struct mystruct {
        long member;
#ifndef _MSC_VER
}__attribute__ ((packed));
#else /* _MSC_VER */
};
#pragma pack(pop)
#endif /* _MSC_VER */

char* greeting_text(){
  return "Hello world\n";
}

int main( int argc, const char* argv[] ){
  char * greeting = greeting_text();
  printf(greeting);
  return 0;
}

これはコンパイルさgcc -Wallれ、Linuxで問題なく動作します。ただし、を使用して解析するとctags problem.ctagsファイルには次のエントリのみが含まれますmystruct-関数がありません。

ctags --verboseレポート:

OPENING problem.c as C language file
problem.c: unexpected closing brace at line 8
problem.c: retrying file with fallback brace matching algorithm
OPENING problem.c as C language file
problem.c: unexpected closing brace at line 8

そのためctags、ファイル内のプリプロセッサのトリックが気に入らないようです。

これを処理する方法はありctagsますか?

のマンページでctagsもこの問題について明示的に言及していますが、ctagsこれを回避できることを示しています。ただし、これは機能していないようです...

これは、Exuberant Ctags 5.8(Debianパッケージ1:5.8-4)を使用したものです。

編集:

また、これらの種類の構成を処理するctagsの代替案にも興味があります。

4

4 に答える 4

2

ctagsの問題のため、代わりにcscopeを使用することになりました。

完璧ではありませんが、ctagsよりもマクロをうまく処理し、ctagsと同じようにvimと統合できます(http://vimdoc.sourceforge.net/htmldoc/if_cscop.html#:cscopeを参照)。

于 2011-09-02T12:31:09.030 に答える
1

gcc -Ectagsに渡す前に、ファイルに対してプリプロセッサ()を実行してみます。これが良い結果を生むかどうかは定かではありませんが、試してみる価値はあります。確かに、コードのすべてのコンポーネントが表示されるはずですが、ctagsは、gccが出力に残す他のファイル参照を認識しますか?わからない。

于 2011-03-15T11:36:11.087 に答える
1

たとえば、閉じ中括弧が1つだけになるように、コードを書き直してみることができます。

struct mystruct {
        long member;
}
#ifndef _MSC_VER
__attribute__ ((packed))
#endif
;
#ifdef _MSC_VER
#pragma pack(pop)
#endif /* _MSC_VER */

もちろん、読みやすくするためにいくつかの便利なマクロを定義することができます。

于 2011-03-21T11:01:32.943 に答える
1

ツールを実行してunifdef、コードの非アクティブな部分を選択的に(そして一時的に)空白行に置き換えることができます(unifdef -l -U_MSC_VER)。結果は

#include <stdio.h>

struct mystruct {
        long member;

}__attribute__ ((packed));





char* greeting_text(){
  return "Hello world\n";
}

int main( int argc, const char* argv[] ){
  char * greeting = greeting_text();
  printf(greeting);
  return 0;
}

Ctagsはこれを正しく解析するのに問題はなく、行番号は同じままです(行番号でctags検索を作成する場合は重要です)。

$ cat tags
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME      Exuberant Ctags //
!_TAG_PROGRAM_URL       http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.6     //
greeting_text   y.c     /^char* greeting_text(){$/;"    f
main    y.c     /^int main( int argc, const char* argv[] ){$/;" f
member  y.c     /^        long member;$/;"      m       struct:mystruct file:
mystruct        y.c     /^struct mystruct {$/;" s       file:

unifdef多くのオペレーティングシステムでパッケージとして利用できます(たとえば、FreeBSD、さまざまなLinuxディストリビューション、Cygwin)。ホームページ:http ://dotat.at/prog/unifdef/

于 2015-01-16T10:26:13.183 に答える