GCC:允许C99中的重载function

我在C99中编写代码并通过GCC编译。 我想使用函数重载的风格原因(否则我必须自己做名称修改)。

我读过有没有理由说C99不支持函数重载? 但是,我仍然想知道它是否可以在GCC中启用。

你能帮助我吗?

不,C99中没有函数重载,即使在愚蠢的GCC扩展中也没有。 C11添加_Generic ,但即便如此,你仍然需要自己修改名称。

 void foo_int(int x); void foo_double(double x); #define foo(arg) _Generic((arg), int: foo_int, double: foo_double)(arg) 

不管是好还是坏,好吧。 这是C.

在C宏中,可能会部分取代其他语言的函数重载。 正如Cat Plus Plus在她的回答中指出的那样,C11具有额外的构造_Generic来编程类型通用宏。

使用C99,您已经可以编写某种意义上通用的宏。 P99具有便于使用它的function,例如,使用不同数量的参数调用这样的宏。 为了区分根据特定参数A调用哪个函数,您可以使用类似(sizeof(A) == sizeof(float) ? sqrtf(A) : sqrt(A))

Gcc具有允许更加舒适地编程这些事物的扩展,即使用({ any code here })typeof块表达式来声明与宏参数相同类型的辅助变量。

LLVM Clang3.3引入了函数重载。 事实上,函数重载可能并不像你期望的那么容易。 它涉及诸如函数调用约定和ABI(应用程序二进制接口)之类的问题。 将C代码与汇编语言混合使用时,可能会出现这些问题。 使用汇编过程时,不应重载导出过程的名称。

在LLVM Clang中,您可以使用attribute(overloadable)执行此操作:

 static void __attribute__((overloadable)) MyFunc(float x) { puts("This is a float function"); } static int __attribute__((overloadable)) MyFunc(int x) { puts("This is an integer function"); return x; }