Cプログラムを使用して、、、、、など#include
のディレクティブの総数を見つけたいのですが#define
、そのためのロジックを提案できますか? スクリプトやツールを使用することに興味はありません。純粋にCプログラムを使用して実行したい。#ifdef
#typedef
3 に答える
それらを解析したくない、または他の種類の構文/意味分析をしたくないと仮定すると、0個以上の空白文字と文字で始まる行の数を単純に数えることができます#
(ゆるくテストされ、正常に動作するはずです):
#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
FILE *f = fopen(argv[1], "r");
char line[1024];
unsigned ncppdirs = 0;
while (feof(f) == 0) {
fgets(line, sizeof(line), f);
char *p = line;
while (isspace(*p))
p++;
if (*p == '#') ncppdirs++;
}
printf("%u preprocessor directives found\n", ncppdirs);
return 0;
}
すべてのディレクティブをポインターの配列 (または配列) に格納します。
C ファイルを 1 行ずつ読み取り、先頭の空白を除いて、最初の単語がリスト内のディレクティブのいずれかで始まるかどうかを確認します。
char *directives[]={"#assert", "#define#, ......};
int count[NUM_DIRS]= { 0 };
一致が見つかるたびに、count
配列の対応するインデックスがインクリメントされます。配列total
に値を追加しないようにするために、別のカウンターを維持することもできます。count
gcc -H
含まれているすべてのファイルが表示されることを利用してpopen
、そのコマンドを実行し、(単純に) その出力を解析することができます。
によって与えられる、前処理された出力を解析することもできgcc -C -E
ます。行情報が含まれています - で始まる行として#
の出現回数を字句的に数えるだけで#include
は十分ではありません<features.h>
。
#if SOME_SYMBOL > 2
#include "some-internal-header.h"
#define SOME_OTHER_SYMBOL (SOME_SYMBOL+1)
#endif
後でインクルードするものもあります#if SOME_OTHER_SYMBOL > 4
また、コンパイル コマンドは、ところでSOME_SYMBOL
eg で定義する場合がありますgcc -DSOME_SYMBOL=3
(このようなトリックは多くの場合Makefile
-s で発生し、最適化するだけ-O2
で__OPTIMIZE__
プリプロセッサで定義されたシンボルが作成されます)。
ソース プログラムについてさらに詳しい情報が必要な場合は、GCC プラグインまたは拡張機能を作成することを検討してください。たとえば、MELT (GCC を拡張するためのドメイン固有言語) を使用します。たとえば、中間表現で Gimple 命令を数えることは、コードの行数を数えることよりも賢明です。
また、一部のマクロはいくつかのことを行う場合がありtypedef
ます。プログラムによっては
#define MYSTRUCTYPE(Name) typedef struct Name##_st Name##_t;
そして後で使用しMYSTRUCTYPE(point)
ます。typedef
-sを数えるということはどういう意味ですか?