Generate C++ code where templates have been expand

2020-03-04 02:29发布

I was wondering if there is a way to use a C++ compiler to just produce C++ code where all templates have been expanded to the instantiations that are required by the program. This code must exist at some point in the compilation process, although probably not in ASCII form by default, but it should not be too difficult to convert it back to readable C++ code in my opinion.

EDIT: I am mostly interested in a solution that will produce actual C++ code (which at least compiles and ideally is also readable), not just an overview of classes and functions that are instantiated. This seems like a useful feature for making complex templated code more readable (e.g. for debugging), or in case the code needs to be processed by software other than a regular C++ compiler, which may not (fully) support templates.

3条回答
地球回转人心会变
2楼-- · 2020-03-04 02:40

I think "Templator" might help: Demo at CppCon2015, Slides

查看更多
不美不萌又怎样
3楼-- · 2020-03-04 02:58

Templates are part of the language, not some pre-processor pass - they are processed by the compiler, just like other code.

There is no way to do this in Visual Studio 2012 (Property -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocess to a File - won't give you expanded templates).

The g++ has a bunch of debug options. I would try -fdump-class-hierarchy (not tested).

查看更多
我欲成王,谁敢阻挡
4楼-- · 2020-03-04 03:03

One way would be to compile your program in debug and then dump the symbols. All the compiled templates must have their symbol defined.

g++ -g foo.cpp -o foo.o

Ofcourse you would missed inlined functions, but this can be suppressed with

g++ -g -fno-inline-functions foo.cpp -o foo.o

To get the symbols use:

objdump -t --demangle a.out
查看更多
登录 后发表回答