我正在做一个GCC插件来判断C和头文件的编码风格. 我在编译时使用以下命令判断编码样式:

register_callback(plugin_info->base_name, PLUGIN_START_UNIT, start_unit_callback, NULL);
register_callback(plugin_info->base_name, PLUGIN_INCLUDE_FILE, include_file_callback, NULL);

第一行只判断C个文件,第二行判断头文件(.h).

但是当涉及到头球判断时,我会遇到性能问题.事实上,它还会判断系统标头!我希望它不会这样做. 这是GCC得到的头文件列表:

/usr/include/stdio.h
/usr/include/bits/libc-header-start.h
/usr/include/features.h
/usr/include/features-time64.h
/usr/include/bits/wordsize.h
/usr/include/bits/timesize.h
/usr/include/bits/wordsize.h
/usr/include/sys/cdefs.h
/usr/include/bits/wordsize.h
/usr/include/bits/long-double.h
/usr/include/gnu/stubs.h
/usr/include/gnu/stubs-64.h
/usr/lib/gcc/x86_64-pc-linux-gnu/13.1.1/include/stddef.h
/usr/lib/gcc/x86_64-pc-linux-gnu/13.1.1/include/stdarg.h
/usr/include/bits/types.h
/usr/include/bits/wordsize.h
/usr/include/bits/timesize.h
/usr/include/bits/wordsize.h
/usr/include/bits/typesizes.h
/usr/include/bits/time64.h
/usr/include/bits/types/__fpos_t.h
/usr/include/bits/types/__mbstate_t.h
/usr/include/bits/types/__fpos64_t.h
/usr/include/bits/types/__FILE.h
/usr/include/bits/types/FILE.h
/usr/include/bits/types/struct_FILE.h
/usr/include/bits/stdio_lim.h
/usr/include/bits/floatn.h
/usr/include/bits/floatn-common.h
/usr/include/bits/long-double.h
test.h

我自己做的唯一包括的是test.h,所以它不能判断其他文件.

那么你知道一种解压所有系统文件的方法吗?

我try 跳过从/usr//lib/的所有包含项,但这不是一个好的做法.

我试图查看是否可以在编译的另一个时刻进行回调,但做得不好(它不判断标头).

感谢您阅读我的文章! 希望您能帮助我:)

推荐答案

所以作为一种暂时的 Select .在等待别人有更好的方法时,我做了这个函数:

char **get_system_includes(void)
{
    FILE *fp;
    char line[MAX_LINE_LENGTH];
    char **includes = (char**)xmalloc(sizeof(char *) * 1024);
    int includes_count = 0;

    fp = popen("echo | gcc -E -v - 2>&1 | awk '/#include </,/^End of search/'", "r");
    if (fp == NULL) {
        error("Could not get system includes");
        exit(1);
    }

    while (fgets(line, sizeof(line), fp) != NULL) {
        line[strcspn(line, "\n")] = 0;

        if (strstr(line, "#include <") != NULL
            || strstr(line, "End of search") != NULL)
            continue;

        char *start = line;
        for (; *start == ' ' || *start == '\t'; start++);

        includes[includes_count] = (char*)xmalloc(strlen(start) + 1);
        strcpy(includes[includes_count], start);
        includes_count++;
    }

    pclose(fp);
    includes[includes_count] = NULL;
    return includes;
}

多亏了它,我可以检索包含我想要忽略的所有系统包含目录的字符串的向量.

C++相关问答推荐

当办公室阻止Visual Studio时编码和编译C

如何在Scilab API中求解方程

使用GOTO从多个嵌套循环C继续

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

在传统操作系统上可以在虚拟0x0写入吗?

C语言编译阶段与翻译阶段的关系

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

处理EPOLL_WAIT中的接收数据和连接关闭信号

如何在VS 2022中正确安装额外的C头文件

覆盖读取函数,但当文件描述符为3或4时,我有问题

如何在不使用字符串的情况下在c中编写函数atof().h>;

Go和C中的数据 struct 对齐差异

用C++高效解析HTTP请求的方法

与外部SPI闪存通信时是否应禁用中断?

C编译和运行

发送和接收的消息中的Unix域套接字不匹配

C中2个数字的加法 - 简单的人类方法

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

C Makefile - 如何避免重复提及文件名

子进程不会修改父进程中的统计信息