我正在尝试使用我自定义的解析器(用c++
编写)来分析c++
个文件。在开始解析之前,我想摆脱所有#define
。我希望在预处理后可以编译源文件。因此,最好的方法是在文件上运行C Preprocessor
。
cpp myfile.cpp temp.cpp
// or
g++ -E myfile.cpp > templ.cpp
[欢迎提出新建议。]
但由于这个原因,原始行和它们的行号将丢失,因为文件也包含所有标题信息,我想保留行号。所以我决定的出路是,
例如,典型的源文件如下所示:
#include<iostream>
#include"xyz.h"
int x;
#define SOME value
/*
** This is a test file
*/
typedef char* cp;
void myFunc (int* i, ABC<int, X<double> > o)
{
//...
}
class B {
};
添加符号后,就像是,
#include<iostream>
#include"xyz.h"
@3@int x;
#define SOME value
@5@/*
@6@** This is a test file
@7@*/
@8@typedef char* cp;
@9@
@10@void myFunc (int* i, ABC<int, X<double> > o)
@11@{
@12@ //...
@13@}
@14@
@15@class B {
@16@};
删除所有宏和注释后,我将留下数千行,其中几百个将是原始源代码。
这种做法是否正确?我错过了任何一个角落?
答案 0 :(得分:3)
你意识到g ++ -E会在其输出中添加一些自己的行,这些行指示原始文件中的行号?你会找到像
这样的行# 2 "foo.cc" 2
表示您正在查看文件foo.cc的第2行。只要常规的行序列中断,就会插入这些行。
答案 1 :(得分:1)
以前使用X11源的imake
程序使用了一个非常相似的系统,用@@
标记行的末尾,以便它可以正确地对它们进行后处理。
gcc -E
的输出通常包括#line
指令;你也许可以用它们代替你的符号。