[go: up one dir, main page]

Menu

Tree [aecab5] master / cxx / rtti /
 History

HTTPS access


File Date Author Commit
 main 2023-09-21 denk denk [66d370] ver-0000
 CMakeLists.txt 2023-09-21 denk denk [66d370] ver-0000
 README.md 2023-09-21 denk denk [66d370] ver-0000
 pytest_examples_cxx_rtti.py 2023-09-21 denk denk [66d370] ver-0000
 sdkconfig.ci 2023-09-21 denk denk [66d370] ver-0000
 sdkconfig.defaults 2023-09-21 denk denk [66d370] ver-0000

Read Me

Supported Targets ESP32 ESP32-C2 ESP32-C3 ESP32-C6 ESP32-H2 ESP32-P4 ESP32-S2 ESP32-S3

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.