GNU C 编译器内部/创建编译器扩展 4 1
外观
C 语言函数重载扩展旨在将 C++ 特性引入 C 语言,允许使用相同名称但参数类型不同的函数。GEM 中的 cfo/test.c 示例展示了此特性
void ec_aa_add(int from, char *to); void ec_aa_add(int from, int to); ...
用于将元素添加到池数据结构。
扩展实现背后的理念是重写每个函数声明,使新名称包含函数参数的类型信息。在上述情况下,修改后的名称为 ec_aa_add_int_char_ptr 和 ec_aa_add_int_int。编译将使用更新后的名称正常继续。
由于上述修改,调用名称也需要修改。重命名会考虑参数类型,以便调用相应的函数。例如,编译器将修改
ec_aa_add(1,2);
为
ec_aa_add_int_int(1,2);
此扩展使用三个钩子。函数 cfo_start_decl() 和 cfo_start_function() 拦截声明。它们调用 cfo_alias_decl(),该函数使用参数类型替换名称。为了保留不使用 CFO 扩展的程序的库代码,使用了以下技术。如果第一次遇到函数名称,则会创建对其旧名称的别名,这样就可以使用任何一个名称来调用该函数。因此,旧代码将使用旧名称,而 CFO 编译的代码将使用类型增强后的名称。最后,声明名称将更新为包含类型信息。
当发现新的函数调用时,解析器会调用钩子 cfo_build_function_call()。它将被调用函数的名称替换为考虑实际输入参数类型的名称。