我想使用 C 程序查找#include
,#define
,#ifdef
,#typedef
等指令的总数,你可以建议任何逻辑吗?我对使用任何脚本或工具不感兴趣。我希望它纯粹使用 C 程序完成。
答案 0 :(得分:1)
假设您不想解析它们或任何其他类型的语法/语义分析,您可以简单地计算以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;
}
答案 1 :(得分:1)
将all the directives存储在指针(或数组)数组中。
逐行读取C文件并检查第一个单词是否以列表中的任何指令开头,不包括开头的任何空格。
char *directives[]={"#assert", "#define#, ......};
int count[NUM_DIRS]= { 0 };
每次找到匹配时,都会增加count
数组的对应索引。您还可以为total
维护另一个计数器,以避免在count
数组中添加值。
答案 2 :(得分:0)
您可以利用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
编译命令可能BTW定义SOME_SYMBOL
,例如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是什么意思?