c++编译器自己做很多事情。但是有没有办法得到它的作用。我的意思是,如果有宏并且我们想看看预处理输出是什么,那么 g++ 中有一个选项-E
。但是,对于以下事情,是否有其他选择:
1( 使用关键字
#include<iostream>
using namespace std;
int main(){
cout<<"hello"<<endl;
}
编译器通过以下方式理解上述代码。
#include<iostream>
int main(){
std::cout<<"hello"<<std::endl;
}
有什么方法可以给编译器一些输入,比如第一个代码并获取第二个代码?
2( 模板
#include<iostream>
template<class T>
class name{
public:
T x;
};
int main(){
name<int> n;
return 0;
}
上面的代码将展开一个以 int 作为模板类型的类名。但是我有什么办法可以得到阶级的定义吗?
3( typedef关键字
我最后一个疑问是关于typedef的。有没有办法获取具有类型化值的替换含义的输出。
typedef int fun;
现在,如果我们使用乐趣,它相当于int。
fun x;
编译器通过以下方式理解上述行:
int x;
但是有没有 G++ 的选项来做到这一点?
typedef 语句的使用关键字语法是using fun=int
但是我们可以得到我想要的相同输出吗?
我目前正在从事一个项目,该项目将c ++文件作为输入并将其所有详细信息转换为json。我的问题是这些别名语法,它们对程序员很有用,但目前给我带来了一个很大的问题。
使用 GCC,您无法以C++友好的格式获得一些 AST(没有选择(。
然而,GCC能够以某种文本格式(通常受C的启发(转储其大部分内部表示(例如GENERIC 或GIMPLE或SSA(。阅读有关 GCC 开发人员选项的信息,并尝试许多-fdump*
选项中的一些。例如,-fdump-tree-all
会转储数百个不同的转储文件。
模板扩展(例如,C++在标准 n3337 中(并没有被完全定义为一些 AST 转换,C++可悲的是它不是一种同象语言(如果你想要更接近它的东西,也许可以看看 Terra(。
如果您认为模板扩展通常可以表示为对您的情况进行一些(更简单的(C++转换C++(一般来说它是错误的,因为C++模板是图灵完备的;另请参阅此内容并考虑递归或可变参数模板(,您可以考虑开发一些 GCC 插件来做到这一点。这将花费您几个月(甚至数年(的时间。
我目前正在从事一个项目,该项目将c ++文件作为输入并将其所有详细信息转换为json。
对于某些 GCC 插件来说,这听起来是一个很好的用例(请务必为最新版本的 GCC 编写它,例如 2018 年 8 月的 GCC 8;GCC 插件与特定版本的 GCC 相关联,而 GCC 甚至在最近就取得了进展。但是,解析C++很复杂(无论您使用哪种技术:GCC 或 Clang(,并且需要大量工作(可能超过一年(。
我的问题是这些别名语法
相信我,这不是你唯一(或最重要的(问题。C++真的很难解析。
附言。我的旧(和过时的(GCC MELT文档页面可能包含有用的幻灯片和链接。