最近研究PostgreSQL源码,对于其中模块加载对接部分很是困惑,跟踪代码的时候总会有断掉线索的嫌疑,因为其中就很多用函数指针+宏定义来实现的,对于其中的宏定义实现的函数定义,自行展开宏定义去分析很是麻烦,还不可靠,可以直接使用编译器可展开得到预编译文件,其中可以看到宏展开后的原代码,查看起来比较方便。

参考下这位朋友写的编译器的编译过程:(瞬间感觉掌握了一项黑科技,宏定义什么的统统?)

https://blog.csdn.net/gt10258...

 

参考下另一个关于vlc中生成预编译文件的过程,目的是为了在原编译环境下生成预编译文件。

https://blog.csdn.net/c_m_den...

 

生成预编译文件的例子:

使用命令:

#gcc -E macro_test.c -o macro_test.i

生成 macro_test.i文件(文件名随便)

查看,里面的宏定义已经被预编译给展开(你会发现这个文件很大,前面把 include也做预编译处理了)

gcc -E hello.c -o hello.i 的作用

 gcc -E  hello.c  -o hello.i

        或者 cpp hello.c > hello.i     【cpp是预编译器】

        将所有#define删除,并且展开所有的宏定义

        处理所有的条件预编译指令,如#if #ifdef  #undef  #ifndef  #endif #elif

        处理#include,将包含的文件插入到此处,这是一个递归的过程

        删除所有注释   //   / /

        添加行号和文件名标识,以便于编译时产生的错误警告能显示行号

        保留#pragma编译器指令


Ocean
1.6k 声望74 粉丝

Mobaxterm