C++ 如何将cpp(c预处理器)与包含路径一起使用

C++ 如何将cpp(c预处理器)与包含路径一起使用,c++,c-preprocessor,C++,C Preprocessor,我正在编写一个对C/C++源文件进行操作的解析器。作为解析器的第一阶段,我需要使用一些已经可用的预处理器,这样我就可以避开指令,比如\define、\ifdef。 对于g++,可用的工具是'cpp'(或g++-E…)。我有两个问题: 我的解析器是用C++编写的,那么在其他C/C++源文件中运行这个“CPP”的最好方法是什么?是不是有点像: system("cpp sourceFile.cpp parsed_sourceFile.cpp"); // just a pseudo code 还是有更

我正在编写一个对C/C++源文件进行操作的解析器。作为解析器的第一阶段,我需要使用一些已经可用的预处理器,这样我就可以避开指令,比如
\define、\ifdef
。 对于g++,可用的工具是
'cpp'
(或
g++-E…
)。我有两个问题:

<>我的解析器是用C++编写的,那么在其他C/C++源文件中运行这个“CPP”的最好方法是什么?是不是有点像:

system("cpp sourceFile.cpp parsed_sourceFile.cpp"); // just a pseudo code
还是有更好的办法

(我只想知道我可以对给定文件执行预处理的可能方式。像
system()
,或
popen()
这样的命令是执行此类操作的标准方式吗?)

  • 如何处理源文件中包含的非标准文件?我不知道这些用户定义的头文件存储在什么地方


  • 系统是最可能的跨平台方式。但如果您的代码是单平台的,则可以通过使用平台的本机API更好地控制子程序的执行。就像在windows中执行ShellExecute一样


    非标准的include文件可以位于多种位置,例如与源脚本位于同一目录中。此类目录通常在项目和项目的MAK文件中提及。您可以打开这些文件并查找其中提到的其他包含位置。但是更容易;)当然,方法是问用户自己这些包含文件在哪里。

    您是在Windows还是*nix上?Win32 API有一些调用(如ShellExecute()。我肯定*nix有自己的,但我不知道它们是什么。不,我使用的是unix类型的平台。我之所以混淆system()是因为,我在某个地方读到,system(“暂停”)是一个错误的、不可移植的命令。但现在我认为,它是特定于“暂停”的,一般不适用于system(),它是不可移植的,因为我不相信“暂停”对所有系统都是通用的。在某些情况下,这也是一种安全风险,因为如果有人用同名的流氓程序替换您系统的“暂停”,那么您用系统编写的每一段代码(“暂停”)都会变得危险。谢谢,我对system()有些怀疑。现在清楚了。顺便说一句,我想用通用的方法设计,所以system()是更好的方法。