【问题标题】:Expand #includes to a text file for C++将 #includes 扩展为 C++ 的文本文件
【发布时间】:2014-03-07 09:46:09
【问题描述】:

是否可以扩展 c++ 文件的 #include 行,可能使用 C 预处理器,这样我就可以在没有 #includes 的情况下读取扩展文件,而是使用是#included?

具体来说,如果我有的话

文件A.cpp:

#include "fileB.H"

int main()
{
//do whatever
return(0);
}

文件B.H:

#include "fileC.H"
//Some lines of code

文件C.H

//Some other lines of code

然后输出:

//Some other lines of code
//Some lines of code

int main()
{
//do whatever
return(0);
}

本质上,将包含在一个大型文本/C++ 代码文件中的文件复制粘贴,而不进行编译?

如果我使用相关的-I<Directory containing files to include> 运行 cpp,那么我会得到一个长文本文件,而不仅仅是代码,它提供了将传递给编译器的内容(呃!)

【问题讨论】:

  • 已发现 stackoverflow.com/questions/2008487/… 是一个类似(相同?)的问题,但已接受的答案对我来说似乎不是很清楚 - 从我正在阅读的内容来看,这是不可能的,但除了“这是一个愚蠢的想法”之外,我不明白为什么它不应该......
  • 如果你使用的是gcc或者clang,可以使用-E:clang++ -E fileA.cpp (stackoverflow.com/questions/3742822/preprocessor-output)
  • @PhillipKinkade 谢谢 - 我找到了 -E 标志,尽管显然无法正确解释输出。这似乎(大致)是我正在寻找的 - 我只需要更仔细地阅读它给我的文件以找到相关部分。干杯
  • @PhillipKinkade 如果您想大致给出一个答案,我会将其标记为已接受?

标签: c++ c-preprocessor


【解决方案1】:

对于 gcc 和 clang,您可以使用 -E 选项 (see similar answer) 来输出预处理器输出而无需编译。

要在示例输出中也显示 cmets,您可以添加 -CC 和 -P 标志:

clang++ -E -CC -P fileA.cpp

All of the processor options for -E can be found on here, on gcc.gnu.org.

-CC 不要丢弃 cmets,包括在宏扩展期间。这类似于 -C,除了宏中包含的 cmets 也被传递 一直到扩展宏的输出文件。

-P 禁止在预处理器的输出中生成线标记。这在运行预处理器时可能很有用 不是 C 代码的东西,将被发送到一个程序 可能会被线标记混淆。

对于 Visual C++ 编译器,您可以使用 /E。 See this SO answer.

【讨论】:

  • -CC 很好,但-P 删除了告诉您哪个文件是哪个文件的标记!你为什么要通过那个?
  • @Potatoswatter -P 是可选的。我将它包含在这里看起来像原始帖子中所需的输出。
  • 我不会过多解读缺乏富有想象力的线标记提案,他不知道会发生什么。它们对于人类解释输出至关重要。
  • @Potatoswatter 是也不是。很多时候,如果我只对某些宏的扩展方式感兴趣,我只会在预处理文件中搜索相关符号。因此,虽然它们对某些目的很有用,但我不会称它们为必不可少的。
  • 虽然显然依赖于实现,-E//E 似乎几乎是通用的;最初的 C 编译器使用 -E 在预处理器之后停止(当时这是一个单独的步骤),预处理器输出进入标准输出,此后几乎每个编译器都这样做了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多