最终二进制文件中是否公开了 typedef?它们在符号文件和 RTTI 中可用吗?

Are typedefs exposed in the final binary? Are they available in symbol files and in RTTI?

目前我正在为函数指针的函数内部创建作用域 typedef,这是对最终二进制文件的影响还是类似于预处理器宏? (查找和替换)

不,他们不携带。它们的行为根本不像预处理器。

至少不使用 MSVC 编译器(假设导出函数)。我也不相信其他人。

Typedef 本质上是一种别名机制。

鉴于一定程度的优化和符号剥离,很少有符号使其成为最终发布的二进制文件。

Typedef 不只是像宏,它们是第一个 class C++ 语言功能,而不仅仅是预处理器完成的文本查找和替换。但它们通常不会在生成的二进制文件中表示,除了下面解释的某些情况。

一个类型有一个 "name for linkage purposes",它是 "true name",编译器和链接器使用它来决定两个类型是否相同。当您使用 typedef 时,编译器会将其转换回它所引用的实际类型。在某些情况下,typedef 名称用于链接目的,例如当类型没有真实名称时,例如匿名结构或匿名枚举类型,例如

typedef struct { } anon_struct;

typedef enum { E=1 } anon_enum;

void f(anon_struct*, anon_enum);

函数 f 需要在其损坏的名称中使用其参数类型的名称,但由于类型没有名称,因此将使用 typedef 名称,这些 typedef 名称可能出现在二进制文件。

typedef 可能在二进制文件中表达的另一种方式是在调试符号中,这是包含在二进制文件中的附加的可选数据,在 运行 时不执行或使用,仅由调试器和类似的工具。