c++ - 解析模板和范围后获取编译文件?
问题描述
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。有什么方法可以用替换后的 typdefed 值的含义来获取输出。
typedef int fun;
现在,如果我们使用 fun 它相当于 int。
fun x;
编译器通过以下方式理解上述行:
int x;
但是g++有什么选择吗?
typedef 语句的 using 关键字语法是,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++ 模板是图灵完备的;另请参阅this并考虑递归或可变参数模板),您可能会考虑开发一些GCC 插件可以做到这一点。这将花费您几个月(甚至几年)的时间。
我目前正在开发一个项目,该项目将 c++ 文件作为输入并将其所有详细信息转换为 json。
对于某些 GCC 插件来说,这听起来是一个很好的用例(一定要为最新版本的 GCC 编写它,例如2018 年 8 月的GCC 8;GCC 插件与特定版本的 GCC 相关联,而且 GCC 甚至在最近 wrt 插件方面也取得了进展)。但是,解析 C++ 很复杂(无论您使用什么技术:GCC 或 Clang),并且需要大量工作(可能超过一年)。
我的问题是这些别名语法
相信我,这不是您唯一(或最重要)的问题。C++ 真的很难解析。
PS。我的旧(和过时的)GCC MELT 文档页面可能包含有用的幻灯片和链接。
推荐阅读
- mongodb - 如何在 Windows 7 32 位上下载 MongoDB Compass?
- javascript - JSDOM:使用 base64 字符串更新“src”属性
- python - docker中的端口映射不适用于python服务器
- github - 我如何知道我发布的 github 操作被使用了多少次?
- c# - 使用 Linq 取消选中所有复选框
- drupal - Drupal Commerce 按价格排序不起作用
- python-3.x - (Discord.py) 从附件 url 读入图片并显示
- python - 忘记模块路径
- node.js - 测量请求和响应快递的大小
- nginx - 如何通过更改 url 名称 Nginx 来保护 phpMyAdmin?