【问题标题】:How do I see a C/C++ source file after preprocessing in Visual Studio?在 Visual Studio 中预处理后如何查看 C/C++ 源文件?
【发布时间】:2010-09-21 14:13:44
【问题描述】:

假设我有一个包含许多预处理器指令的源文件。预处理器完成后是否可以查看它的外观?

【问题讨论】:

  • 如果您提供更多信息,例如您使用的编译器,将会有所帮助。
  • 我目前使用 Visual Studio 2005 作为我的 IDE。
  • 那么默认你使用的是cl.exe编译器。
  • 当他说他正在使用 VS2005 时,为什么接受 gcc 答案?
  • 相关:Compiler info.

标签: c++ c debugging visual-studio-2005 c-preprocessor


【解决方案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,我将留给其他发帖人提供答案,因为我不是那里的专家。

【讨论】:

【解决方案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++ 的响应不一致):

        如果您想预处理一个没有#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 的文件。打开它并查看您的扩展预处理器。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-17
              • 1970-01-01
              相关资源
              最近更新 更多