代码之家  ›  专栏  ›  技术社区  ›  Ravinder Singh

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

c++
  •  0
  • Ravinder Singh  · 技术社区  · 8 年前

    C++编译器本身有很多事情要做。但是有没有办法得到它的作用呢。我的意思是,如果有宏,我们想看看什么是预处理输出,有一个选项 -E 在g++中。但对于以下事项,还有其他选择吗:

    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。是否有任何方法可以获得替换了typedefed值含义的输出。

       typedef int fun;
    

    现在如果我们使用fun,它相当于int。

       fun x;
    

    编译器可以通过以下方式理解上述行:

       int x;
    

    但是有没有g++的选项可以实现这一点呢?

    typedef语句的using关键字语法为 using fun=int 但是我们能得到我想要的同样的产量吗。

    我目前正在做一个项目,它把C++文件作为输入,并把它的所有细节转换成JSON。我的问题是这些别名语法对程序员很有用,但目前给我带来了一个很大的问题。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Basile Starynkevitch    8 年前

    具有 GCC 你不能用C++友好的格式获得一些AST(没有) option 为此)。

    然而,GCC能够转储其大多数内部表示(例如。 GENERIC GIMPLE SSA ),以某种文本格式(通常受C语言启发)。了解GCC developer options 试试其中的一些 -fdump* 选项。例如 -fdump-tree-all 会转储数百个不同的转储文件。

    Template 扩展不是(例如,在C++标准中) n3337 )确切地定义为一些AST转换和C++是可悲的不是 homoiconic 语言(也许是调查) Terra 如果你想要更接近这一点)。

    如果你相信模板扩展通常可以用C++ C++来表示(更简单)C++的转换(通常是错误的) C++ templates are Turing complete ; 另见 this 想想递归或 variadic 模板)你可以考虑开发一些 GCC plugin 这样做。这将花费你几个月(甚至几年)的时间。

    我目前正在做一个项目,它把C++文件作为输入,并把它的所有细节转换成JSON。

    对于某些GCC插件来说,这听起来是一个很好的用例(一定要写一个完整的版本) 最近的 GCC的版本,例如。 GCC 8 2018年8月;GCC插件与特定版本的GCC相关联,GCC甚至在最近取得了进展(w.r.t.插件)。然而,解析C++是复杂的(无论你使用的技术是:GCC还是CLAN),它将花费大量的工作(可能要比一年多)。

    我的问题是这些别名语法

    相信我,这不是你唯一(或最重要)的问题。 C++很难解析 .

    注:我的旧(和过时) GCC MELT documentation 页面可能包含有用的幻灯片和链接。