在 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 中的“预处理到文件”。 顺便说一句,该文件是在输出目录中创建的(例如ReleaseDebug),扩展名为.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++ 源文件?的主要内容,如果未能解决你的问题,请参考以下文章

visualstudio如何打开菜单资源

Visual Studio Code设置在浏览器中查看html页面后显示空白?

Visual Studio:如何在 IntelliSense 中显示重载?

查看分支是在 Visual Studio 2019/2022(或 Rider)中直接创建后的更改

visual studio 2013 wpf 添加窗口加载和关闭函数

如何在 Visual Studio 2013 中查看代码审查注释