gcc 是否有一个工具或编译器选项可以计算“编译的代码行数”?

超越时间

对于比较 Linux 内核编译时间,如果之后(实际上)编译的代码行有一个数字,那将非常有帮助。在编译之前对内核源执行“cloc”只是解决方案的一部分,因为该值对于每个内核配置都是相等的,无论是否配置为“tinyconfig”或“allyesconfig”或“localmodconfig”。

向 gcc 邮件列表添加了可能支持此问题的请求
( https://gcc.gnu.org/ml/gcc-help/2019-03/msg00057.html )

编辑(来自 Mike Kinghan 03/09/2019 回答下面的评论):
“这个数字应该是一个规范化因素,用于比较以前版本和未来几年不同版本的 linux 内核的编译时间。”

迈克·金汉

看来你要计算预处理后编译器消耗的代码行数。这究竟是什么意思是有争议的,但我认为合理的计数方式足以满足您的目的。一个 GNU Make 生成文件,例如:

生成文件

%.o: %.c    # Cancel built-in rule
%.o: %.i
    $(CC) $(CFLAGS) -c $< -o $@
    @loc=$$(wc -l $<); echo "Compiled $${loc%% *} LOC from $<"

%.i: %.c
    $(CC) $(CPPFLAGS) -E -P $< > $@

说明了一种方法:-

  • 首先预处理源文件。
  • 计算预处理输出的行数。
  • 编译预处理的输出。

Makefile 避免了对源代码进行两次预处理的浪费,因为 gcc 将扩展名识别.i表示已经预处理过的 C 源文件的文件,并且不会再次对其进行预处理。清理中间.i文件也是不必要的,因为 GNU make 将它们识别为中间文件并自动删除它们。例子:

$ cat foo.c
#ifdef FOO

/* A
 * B
 * C
 */
int foo(int x, int y)
{
    while(x < y) {
        if (++x == y) {
            return y;
        }
        --y;
    }
    while(y < x) {
        if (++y == x) {
            return x;
        }
        --x;
    }
    return y;
}

#else

/* D */
int bar(int x) {
    return x * x;
}

#endif

$ make foo.o
cc  -E -P foo.c > foo.i
cc  -c foo.i -o foo.o
Compiled 3 LOC from foo.i
rm foo.i

$ rm foo.o
$ make CPPFLAGS=-DFOO foo.o
cc -DFOO -E -P foo.c > foo.i
cc  -c foo.i -o foo.o
Compiled 16 LOC from foo.i
rm foo.i

您可能希望在预处理步骤中传递该-P选项,如图所示,以抑制会增加行数的行标记输出的产生。例如,您可能不想foo.i成为:

$ cc -DFOO -E foo.c > foo.i
$ cat foo.i
# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "foo.c"






int foo(int x, int y)
{
    while(x < y) {
        if (++x == y) {
            return y;
        }
        --y;
    }
    while(y < x) {
        if (++y == x) {
            return x;
        }
        --x;
    }
    return y;
}

而是希望它是:

$ cc -DFOO -E -P foo.c > foo.i
$ cat foo.i
int foo(int x, int y)
{
    while(x < y) {
        if (++x == y) {
            return y;
        }
        --y;
    }
    while(y < x) {
        if (++y == x) {
            return x;
        }
        --x;
    }
    return y;
}

显然,对于编译许多源文件的 make-system,您可以设计更多或不同的设备来将每个文件的 LOC 报告相加。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有一个 gcc 编译器选项可以帮助捕获形式和实际参数类型不匹配?

是否可以使用GCC来编译具有特定编译器标志的代码文件的一部分?

GCC编译器一个字节中有多少位数

GCC 预编译器宏 ## ,与另一个宏的标记连接

在为 arm 进行交叉编译时,是否有特定的编译器标志可以使用 gcc sync-builtins?

交叉编译:特殊的交叉编译器还是带有-march选项的gcc?

gcc -O0仍然优化出“未使用”的代码。是否有一个编译标志来改变它?

C++17 编译器(gcc 或 Microsoft Visual C++),是否有选项禁止“不产生临时”功能

gcc编译器无法识别-fno-plt选项

我可以为gfortran使用哪些gcc编译器选项

gcc编译器是否尊重我的代码中编写的表达式形式?

是否可以在gcc编译器中使用clang std库?

是否可以使用多个目标构建 GCC 交叉编译器和 Binutils?

为什么在GCC中需要传递两个编译器标志以覆盖代码

如何在没有 gcc 编译器的情况下在 docker 中打包和发布一个简单的 c 应用程序?

GCC编译器错误优化

在SCO中安装GCC编译器

OIS GCC编译器错误

在gcc编译器之前构建binutils

gcc编译器__SIZE_TYPE__

cygwin-gcc编译器安装

gcc编译器警告标志丢失

选择默认的gcc / g ++编译器

GNU GCC 编译器 - 对齐属性

如何规避Anaconda GCC编译器?

gcc中的编译器优化

将gfortran与gcc编译器匹配

如何找回默认的gcc编译器?

如何使GCC编译器正常工作?