69 lines
2.2 KiB
Markdown
69 lines
2.2 KiB
Markdown
# Example: C++ run-time type info (RTTI)
|
|
|
|
(See the README.md file in the upper level 'examples' directory for more information about examples.)
|
|
|
|
This example demonstrates usage of the RTTI feature in ESP-IDF.
|
|
|
|
By default, RTTI support is disabled in ESP-IDF. It can be enabled using `CONFIG_COMPILER_CXX_RTTI` configuration option.
|
|
|
|
In this example, `sdkconfig.defaults` file sets `CONFIG_COMPILER_CXX_RTTI` option. This enables compile time support for RTTI (`-frtti` compiler flag).
|
|
|
|
The example prints demangled type names of a few objects and functions, obtained from `typeinfo().name`. The example also generates several objects of two classes, derived from a common base class. For each object, it is demonstrated that `dynamic_cast` behaves as expected, returning non-NULL when casting to the real object type, and NULL when casting to a different type.
|
|
|
|
## How to use example
|
|
|
|
### Configure the project
|
|
|
|
To run this example, no additional configuration is necessary.
|
|
|
|
### Build and Flash
|
|
|
|
Build the project and flash it to the board, then run monitor tool to view serial output:
|
|
|
|
```
|
|
idf.py -p PORT flash monitor
|
|
```
|
|
|
|
(Replace PORT with the name of the serial port to use.)
|
|
|
|
(To exit the serial monitor, type ``Ctrl-]``.)
|
|
|
|
See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects.
|
|
|
|
## Example Output
|
|
|
|
```
|
|
Type names of a few objects:
|
|
Type name of std::cout is: std::ostream
|
|
Type name of std::cin is: std::istream
|
|
Type of app_main is: void ()
|
|
Type name of a lambda function is: app_main::{lambda(int, int)#1}
|
|
|
|
Generating 5 random objects and printing their types:
|
|
obj->name() is: DerivedB
|
|
typeid(*obj).name() is: DerivedB
|
|
dynamic_cast<DerivedA*>(obj)=0
|
|
dynamic_cast<DerivedB*>(obj)=0x3ffb7e88
|
|
|
|
obj->name() is: DerivedB
|
|
typeid(*obj).name() is: DerivedB
|
|
dynamic_cast<DerivedA*>(obj)=0
|
|
dynamic_cast<DerivedB*>(obj)=0x3ffb7e9c
|
|
|
|
obj->name() is: DerivedA
|
|
typeid(*obj).name() is: DerivedA
|
|
dynamic_cast<DerivedA*>(obj)=0x3ffb7eb0
|
|
dynamic_cast<DerivedB*>(obj)=0
|
|
|
|
obj->name() is: DerivedB
|
|
typeid(*obj).name() is: DerivedB
|
|
dynamic_cast<DerivedA*>(obj)=0
|
|
dynamic_cast<DerivedB*>(obj)=0x3ffb7ec4
|
|
|
|
obj->name() is: DerivedA
|
|
typeid(*obj).name() is: DerivedA
|
|
dynamic_cast<DerivedA*>(obj)=0x3ffb7ed8
|
|
dynamic_cast<DerivedB*>(obj)=0
|
|
|
|
Example finished.
|
|
```
|