2011-03-19 60 views
0

我正在编写一个解析器,它对C/C++源文件进行操作。作为解析器的第一阶段,我需要使用一些已经可用的预处理器,这样我就可以脱离诸如#define, #ifdef之类的指令。 对于g ++,可用的工具是'cpp'(或g++ -E ...)。我有2个问题:如何使用包含路径的cpp(c预处理器)

  1. 我分析器用C++编写,所以这可能是运行在其他C/C++源文件,这个“CPP”的最佳方式?是这样的:

    system("cpp sourceFile.cpp parsed_sourceFile.cpp"); // just a pseudo code 
    

    还有没有更好的方法?

    (我想知道,只有用它,我可以在指定的文件进行预处理的可能途径。有喜欢system()这些命令,或popen()是做这样的事标准的方式?)

  2. 我怎么能走照顾源文件内的非标准包含文件?我不知道这些用户定义的头文件存储在哪个地方。

+0

你是在Windows还是* nix? Win32 API有一些调用(如ShellExecute())。我相信*尼克斯有他们自己的,但我不知道他们是什么。 – jonsca 2011-03-19 12:36:31

+0

不,我正在使用unix类型的平台。为什么我与system()混淆是因为,我在某处读到系统(“PAUSE”)是一个糟糕且不可移植的命令。但是现在我认为,它是特定于“暂停”而不是一般意义上的system()。 – iammilind 2011-03-20 16:15:46

+0

它不可移植,因为我不相信所有系统都有“暂停”的通用性。在某些情况下,这也是一种安全风险,因为如果某人用一个同名的流氓程序替换了系统的“暂停”,那么您用系统编写的每段代码(“暂停”)都会变得危险。 – jonsca 2011-03-20 21:17:00

回答

0

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

有很多地方可以找到非标准的包含文件,例如与源脚本位于相同的目录中。这些目录通常在项目的项目和MAK文件中提及。您可以打开这些文件并查找其中提到的额外包含位置。但更简单的方法当然是向用户自己询问这些包含文件在哪里。

+0

谢谢,我对系统()有些怀疑。现在很明显。顺便说一句,我想以通用的方式进行设计,所以system()是更好的方法。 – iammilind 2011-03-20 16:19:19