众所周知,在C中不存在函数重载,不过LLVM提供了额外的扩展,实现了C函数的重载。要是用这个特性也十分简单,只需要在声明函数时加上__attribute__((overloadable))即可。
不过这个特性(据我所知)只在LLVM里提供。如果你的程序需要在其他没有LLVM编译器的平台下编译的话,请直接简单粗暴的换个函数名。
以下是使用LLVM重载的例子:
#include <stdio.h> __attribute__((overloadable)) void foo(int a){ printf("%d\n",a); } __attribute__((overloadable)) void foo(double a){ printf("%lf\n",a); }
那么LLVM是怎么处理这个overloadable属性的呢?我们编译一下看看生成的函数符号。
$ clang -dynamiclib overloadable.c -o overloadable.dylib $ nm overloadable.dylib
我们可以看到,LLVM生成的函数符号是__Z3food和__Z3fooi
实际上这和C++的函数符号生成的方式是一样的。