预处理后gcc可以输出C代码吗?

时间:2011-02-04 17:18:18

标签: c c-preprocessor preprocessor preprocessor-directive

我正在使用一个开源库,它似乎有很多预处理指令来支持除C之外的许多语言。这样我就可以研究库正在做什么我想看看我的C代码在预处理之后编译,更像是我写的。

gcc(或Linux中常用的任何其他工具)可以读取这个库,但输出的C代码是否已将预处理转换为任何内容并且也可由人类读取?

6 个答案:

答案 0 :(得分:170)

是。将gcc传递给-E选项。这将输出预处理的源代码。

答案 1 :(得分:57)

cpp是预处理器。

运行cpp filename.c输出预处理代码,或者更好,将其重定向到文件 cpp filename.c > filename.preprocessed

答案 2 :(得分:11)

我使用gcc作为预处理器(对于html文件。)它可以满足您的需求。它扩展了#34;# - "指令,然后输出一个可读文件。 (没有其他的C / HTML预处理器我尝试过这样做 - 它们连接行,阻塞特殊字符等)。假设你安装了gcc,命令行是:

gcc -E -x c -P -C -traditional-cpp code_before.cpp> code_after.cpp

(不必是' cpp'。)http://www.cs.tut.fi/~jkorpela/html/cpre.html对此用法有很好的描述。

" -traditional-cpp"保留空白和空间标签。

答案 3 :(得分:7)

执行命令

gcc -E <file>.c

g++ -E <file>.cpp

答案 4 :(得分:2)

-save-temps

这是要记住的另一个好选择:

gcc -save-temps -c -o main.o main.c

main.c

#define INC 1

int myfunc(int i) {
    return i + INC;
}

现在,除了正常输出main.o之外,当前工作目录还包含以下文件:

  • main.i是所需的预设文件,包含:

    # 1 "main.c"
    # 1 "<built-in>"
    # 1 "<command-line>"
    # 31 "<command-line>"
    # 1 "/usr/include/stdc-predef.h" 1 3 4
    # 32 "<command-line>" 2
    # 1 "main.c"
    
    
    int myfunc(int i) {
        return i + 1;
    }
    
  • main.s是一个奖励:-),它包含生成的程序集:

        .file   "main.c"
        .text
        .globl  myfunc
        .type   myfunc, @function
    myfunc:
    .LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    %edi, -4(%rbp)
        movl    -4(%rbp), %eax
        addl    $1, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
    .LFE0:
        .size   myfunc, .-myfunc
        .ident  "GCC: (Ubuntu 6.4.0-17ubuntu1~16.04) 6.4.0 20180424"
        .section    .note.GNU-stack,"",@progbits
    

如果要处理大量文件,请考虑改用:

 -save-temps=obj

将中间文件保存为与-o对象输出相同的文件,而不是cwd,从而避免了潜在的基名冲突。

在Ubuntu 16.04 amd64,GCC 6.4.0中进行了测试。

答案 5 :(得分:1)

假设我们有一个名为Message.cpp的文件或一个.c文件

步骤1:预处理(参数-E)

g ++ -E。\ Message.cpp> P1

生成的P1文件具有扩展的宏,并且头文件的内容和注释被剥离。

步骤2:将预处理的文件转换为程序集(参数-S)。该任务由编译器完成

g ++ -S。\ Message.cpp

生成了一个汇编器(ASM)(Message.s)。它具有所有汇编代码。

步骤3:将汇编代码转换为目标代码。注意:Message.s是在Step2中生成的。 g ++ -c。\ Message.s

将生成一个名为Message.o的对象文件。它是二进制形式。

步骤4::链接目标文件。该任务由链接器完成

g ++。\ Message.o -o MessageApp

此处生成一个exe文件MessageApp.exe。

#include <iostream>
using namespace std;

 //This a sample program
  int main()
{
cout << "Hello" << endl;
 cout << PQR(P,K) ;
getchar();
return 0;
}