解析模板和范围后获取编译文件?

get Compilation file after resolving templates and scope?

本文关键字:获取 编译 文件 范围      更新时间:2023-10-16

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文档页面可能包含有用的幻灯片和链接。