解析模板和范围后获取编译文件?
get Compilation file after resolving templates and scope?
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文档页面可能包含有用的幻灯片和链接。
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何在常量计算表达式中获取编译时错误?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 无法获取 wig %ignore 以忽略命名空间中的类,从而导致编译错误
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 解析模板和范围后获取编译文件?
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- 在编译时通过 constexpr 或模板函数获取多维 std::array 的大小
- 为什么在编译时无法获取模板函数的参数计数?
- 在编译时使用可变参数模板在 c++ 中使用参数类型检查获取函数的参数数
- 获取编译文件的列表,并由Make Project包含
- 在 STL 中使用映射获取编译错误C++
- C++获取编译代码中使用的代码部分的大小
- 使用ntddscsi.h获取编译错误
- 在以下程序中获取编译链接错误
- 在没有宏的情况下获取编译时间日期和时间
- 从.exe获取编译日期和时间
- 获取编译时静态constexpr数组的最小/最大值
- Qt-如何获取|编译Mysql驱动程序
- 按照第一个hello world示例在VS2010中获取编译错误