计算#include和#define的数量

时间:2012-12-24 18:19:55

标签: c include c-preprocessor conditional-compilation

我想使用 C 程序查找#include#define#ifdef#typedef等指令的总数,你可以建议任何逻辑吗?我对使用任何脚本或工具不感兴趣。我希望它纯粹使用 C 程序完成。

3 个答案:

答案 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是什么意思?