最近研究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编译器指令
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。