假设我有一个带有许多预处理器指令的源文件。是否有可能看到它在预处理器完成后的样子?
当前回答
正如bk1e和Andreas M.回答的那样,编译器的/P选项将导致它对文件进行预处理。然而,在我使用VS2005和Platform Builder(用于嵌入式ARM处理器)的项目中,该项目没有在对话框中显示选项(如Jim B所描述的)来启用该选项。
我可以手动运行CL并添加/P,但它失败了,因为我不知道Platform Builder在完整构建期间无形地激活的所有适当的命令行选项。所以我需要知道所有的选项。
我的解决方案是查看build.log文件,并找到执行的行
CL等等myfile。c
我把这行复制到剪贴板上。“废话”部分包含构建选项,而且非常大。
回到IDE,我右键单击myfile.c,选择“Open Build Window”,然后在该窗口中粘贴构建命令行,并添加“/P”。
CL /P等等myfile.c
完成了。myfile。生成I文件,其中包含预处理器输出。
其他回答
我对微软编译器一无所知,但在GCC上你可以使用这个:
gcc -E -P -o result.c my_file.h
如果你想看到注释,使用这个:
gcc -E -C -P -o result.c my_file.h
本页有更多选项。
如果您正在使用微软的c++编译器,请尝试cl /EP。
CPIP是一个新的C/ c++预处理器,用Python编写。如果您想要预处理文件的详细可视化表示,可以尝试一下。
CPIP is a C/C++ pre-processor implemented in Python. Most pre-processors regard pre-processing as a dirty job that just has to be done as soon as possible. This can make it very hard to track down subtle defects at the pre-processing stage as pre-processors throw away a lot of useful information in favor of getting the result as cheaply as possible. Few developers really understand pre-processing, to many it is an obscure bit of black magic. CPIP aims to improve that and by recording every detail of preprocessing so CPIP can can produce some wonderfully visual information about file dependencies, macro usage and so on. CPIP is not designed to be a replacement for cpp (or any other established pre-processor), instead CPIP regards clarity and understanding as more important than speed of processing.
您通常需要对预处理器的输出进行一些后处理,否则所有宏都将扩展为一行,这很难读取和调试。对于C代码,像下面这样的代码就足够了:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
对于c++代码,这实际上要难得多。对于GCC/g++,我发现这个Perl脚本很有用。
正如bk1e和Andreas M.回答的那样,编译器的/P选项将导致它对文件进行预处理。然而,在我使用VS2005和Platform Builder(用于嵌入式ARM处理器)的项目中,该项目没有在对话框中显示选项(如Jim B所描述的)来启用该选项。
我可以手动运行CL并添加/P,但它失败了,因为我不知道Platform Builder在完整构建期间无形地激活的所有适当的命令行选项。所以我需要知道所有的选项。
我的解决方案是查看build.log文件,并找到执行的行
CL等等myfile。c
我把这行复制到剪贴板上。“废话”部分包含构建选项,而且非常大。
回到IDE,我右键单击myfile.c,选择“Open Build Window”,然后在该窗口中粘贴构建命令行,并添加“/P”。
CL /P等等myfile.c
完成了。myfile。生成I文件,其中包含预处理器输出。
推荐文章
- C多行宏:do/while(0) vs作用域块
- 找出质数最快的算法是什么?
- 我如何调试git/git-shell相关的问题?
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- c++枚举类可以有方法吗?
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- Visual Studio拒绝忘记断点?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 如果不是内存地址,C指针到底是什么?
- 如何在Python自己的调试器(PDB)中执行多行语句