在 Visual Studio 中预处理后如何查看 C/C++ 源文件?
Posted
技术标签:
【中文标题】在 Visual Studio 中预处理后如何查看 C/C++ 源文件?【英文标题】:How do I see a C/C++ source file after preprocessing in Visual Studio? 【发布时间】:2010-09-21 14:13:44 【问题描述】:假设我有一个包含许多预处理器指令的源文件。预处理器完成后是否可以查看它的外观?
【问题讨论】:
如果您提供更多信息,例如您使用的编译器,将会有所帮助。 我目前使用 Visual Studio 2005 作为我的 IDE。 那么默认你使用的是cl.exe编译器。 当他说他正在使用 VS2005 时,为什么接受 gcc 答案? 相关:Compiler info. 【参考方案1】:大多数编译器都可以选择只运行预处理器。 例如,gcc提供-E:
-E Stop after the preprocessing stage; do not run the compiler proper.
The output is in the form of preprocessed source code, which is sent
to the standard output.
所以你可以运行:
gcc -E foo.c
如果你找不到这样的选项,你也可以在你的机器上找到 C 预处理器。它通常称为 cpp 并且可能已经在您的路径中。像这样调用它:
cpp foo.c
如果您需要从其他目录中包含头文件,您可以将 -I/path/to/include/dir 传递给其中任何一个,就像使用常规编译一样。
对于 Windows,我将留给其他发帖人提供答案,因为我不是那里的专家。
【讨论】:
gcc 问题:***.com/questions/3916979/…【参考方案2】:在 Visual Studio 中,您可以使用 /P 编译文件(或项目)。
【讨论】:
【参考方案3】:如果您使用的是 Microsoft 的 C++ 编译器,请尝试 cl /EP
。
【讨论】:
【参考方案4】:右键单击解决方案资源管理器中的文件,转到属性。在 Configuration Properties->C/C++->Preprocessor 下,“生成预处理文件”就是您要查找的内容。然后在解决方案资源管理器中右键单击该文件并选择“编译”。预处理文件在输出目录(例如 Release、Debug)中创建,扩展名为 .i(感谢 Steed 的评论)。
【讨论】:
VS2010 中的“预处理到文件”。 顺便说一句,该文件是在输出目录中创建的(例如Release
,Debug
),扩展名为.i
。
这很有帮助,因为它使用项目中已经设置的构建配置来查找所有正确的标头。
注意,对我来说,在 MSVC 2015 上,.i 文件不在 输出目录,而是在项目的 中间目录。如果你例如,这些是不一样的。使用 CMake 生成您的项目。【参考方案5】:
您通常需要对预处理器的输出进行一些后处理,否则所有宏都只是扩展为一个行,这很难阅读和调试。对于 C 代码,类似以下内容就足够了:
gcc -E code.c | sed '/^\#/d' | indent -st -i2 > code-x.c
对于 C++ 代码,实际上要困难得多。对于 GCC/g++,我发现 this Perl script 很有用。
【讨论】:
【参考方案6】:cl.exe
,Microsoft Visual C++ 的命令行接口,有三个不同的选项用于输出预处理文件(因此之前关于 Visual C++ 的响应不一致):
/E
:preprocess to stdout(类似于 GCC 的 -E 选项)
/P
: preprocess to file
/EP
: preprocess to stdout without #line directives
如果您想预处理一个没有#line 指令的文件,请结合/P
和/EP
选项。
【讨论】:
如何将这些命令传递给带有 nmake 和 Makefile 的项目? @WooDzu 使用 NMAKE (nmake.exe) 自动执行使用传统 makefile 构建 Visual C++ 项目的任务。 ~msdn.microsoft.com/en-us/library/f35ctcxw.aspx 请注意/P
会抑制 obj 文件的生成。所以如果你把/P
选项,你可能会得到一个错误的链接,说一些obj文件找不到,因为它实际上根本没有生成。
在尝试使用 MS 编译器 (cl
) 时,请确保您位于 VS Developer command prompt
而不是 Command prompt
。编译器在常规命令提示符下不可用。
VS2019 社区:/P LNK 1104 错误仍然很热门。【参考方案7】:
正如 bk1e 和 Andreas M. 回答的那样,编译器的 /P 选项将导致它预处理文件。但是,在我使用 VS2005 和 Platform Builder(用于嵌入式 ARM 处理器)的项目中,该项目没有在对话框中显示启用该选项的选项(如 Jim B 所述)。
我可以手动运行 CL 并添加 /P,但它失败了,因为我不知道在完整构建期间由 Platform Builder 不可见地激活的所有适当命令行选项。所以我需要知道所有这些选项。
我的解决方案是查看 build.log 文件,并找到执行的行
CL blah-blah-blah myfile.c
我将此行复制到剪贴板。 “blah-blah-blah”部分包含构建选项,而且很大。
回到 IDE,我右键单击 myfile.c,选择“打开构建窗口”,然后在该窗口中粘贴构建命令行,并添加一个“/P”。
CL /P blah-blah-blah myfile.c
完成。生成了 myfile.i 文件,其中包含预处理器输出。
【讨论】:
【参考方案8】:我对微软编译器一无所知,但是在 GCC 上你可以使用这个:
gcc -E -P -o result.c my_file.h
如果你想看 cmets 使用这个:
gcc -E -C -P -o result.c my_file.h
this page 提供更多选项。
【讨论】:
这也适用于 gcc 派生的编译器,例如 qcc.exe - 谢谢!【参考方案9】:CPIP 是一个用 Python 编写的新的 C/C++ 预处理器。如果您想要预处理文件的详细可视化表示,请试一试。
CPIP 是一个用 Python 实现的 C/C++ 预处理器。大多数预处理器将预处理视为一项必须尽快完成的肮脏工作。这使得在预处理阶段追踪细微缺陷变得非常困难,因为预处理器会丢弃大量有用信息,以尽可能便宜地获得结果。
很少有开发人员真正了解预处理,对许多人来说,这是一种晦涩难懂的黑魔法。 CPIP 旨在改进这一点,并通过记录预处理的每一个细节,以便 CPIP 可以生成一些关于文件依赖关系、宏使用等的精彩视觉信息。
CPIP 并非旨在替代 cpp(或任何其他已建立的预处理器),而是 CPIP 认为清晰度和理解比处理速度更重要。
【讨论】:
【参考方案10】:在 Windows 操作系统上,对这个问题的简单回答是在 DOS 提示符下使用以下命令来查看预处理文件:
CL /P /C myprogram.c
这将生成一个名为 myprogram.i 的文件。打开它并查看您的扩展预处理器。
【讨论】:
以上是关于在 Visual Studio 中预处理后如何查看 C/C++ 源文件?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio Code设置在浏览器中查看html页面后显示空白?
Visual Studio:如何在 IntelliSense 中显示重载?
查看分支是在 Visual Studio 2019/2022(或 Rider)中直接创建后的更改