gcc 预编译

2020-02-04  本文已影响0人  Kare

最近在做一个关于重写符号表的 shell,但是其中用到了预编译的知识。所以先补一补 gcc 预编译的知识。明白整个编译过程,更是极好的。

简单提一下编译过程

预编译

#include<stdio.h>
int main(int argc, char **argv) {
    printf("Hello, world!\n");
    printf("This is define value is\n");
    #pragma message("编译")
    return 0;
}

这是示例代码
使用 gcc -E main.c -o main.s 定义的 pragma message 会被打印
接下来使用 gcc -S main.i -o main.s 也会被打印

编译

汇编器

连接器


相关编译命令


本文其实主要是为了说一个小重点,在预编译阶段的条件编译

命令行定义宏:可以使用 gcc -D 选型来定义宏,我就是使用这个预编译命令来修改符号表的

gcc -DMAX=1 main.c 等价于 #define MAX 1 语句

具体用法示例:

#include<stdio.h>
int main(int argc, char **argv) {
    printf("Hello, world!\n");
    printf("This is define value is %f\n", MAX);
    return 0;
}

使用 gcc -DMAX=10 -E main.c -o main.i 编译一下,生成了很多代码,提取出来的如下

int main(int argc, char **argv) {
 printf("Hello, world!\n");
 printf("This is define value is %f\n", 10);
 return 0;
}

可以看出,他已经把我在编译时加入的参数,编译到了源文件,也证明了在预编译极端,会把#define 的值替换为原始值的论点

主要命令参数是
gcc -D

下一篇就要说,如何用 llvm 的命令,以及利用预编译参数重写符号表。

上一篇 下一篇

猜你喜欢

热点阅读