LLVM的扩展——对C函数的重载

众所周知,在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

屏幕快照 2015-05-12 下午8.18.56

我们可以看到,LLVM生成的函数符号是__Z3food和__Z3fooi

实际上这和C++的函数符号生成的方式是一样的。

Leave a Reply

Your email address will not be published. Required fields are marked *

20 + fifteen =