【问题标题】:GCC: Allow overloaded functions in C99GCC:在 C99 中允许重载函数
【发布时间】:2012-03-25 22:05:13
【问题描述】:

我用 C99 编写代码并通过 GCC 编译。出于文体原因,我想使用函数重载(否则我必须自己进行名称修改)。

我已经阅读了Is there a reason that C99 doesn't support function overloading?,但是我仍然想知道它是否可以在 GCC 中启用。

你现在能帮我吗?

【问题讨论】:

  • 一个简单的解决方法是使用 C++ 而不是 C。此外,重载需要名称修饰,这在 C++ 中存在但在 C 中不存在。所以 C++ 实际上是您的关键。
  • CGG 是什么?如果您想要高级语言功能,例如函数重载,那么您可能应该考虑使用更合适的语言,例如 C++。
  • 世界和我们的机器已经为不需要链接器的 C 版本做好了准备!进步。绝对领先于 C++ 人。
  • 我假设CGGGCC 的拼写错误?
  • 函数指针表。砰。完成。

标签: c gcc c99 overloading


【解决方案1】:

不,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。

【讨论】:

  • 最接近我正在寻找的功能。
  • 这不是真的。使用“愚蠢”的 GCC 扩展可以实现函数重载。看到这个帖子:stackoverflow.com/questions/36506988/…
  • 我链接的解决方案在 C99 中工作。您说在 C99 中这是不可能的。
  • 好在有人在公元 2016 年留意那些可怜的 C99 用户!!
  • 有人必须这样做。 ;) 此外,这就是 OP 所要求的。
【解决方案2】:

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

使用 C99,您已经可以编写某种意义上的泛型宏。 P99 具有易于使用的功能,例如使用不同数量的参数调用此类宏。要根据特定参数 A 区分要调用的函数,您可以使用类似 (sizeof(A) == sizeof(float) ? sqrtf(A) : sqrt(A)) 的内容。

Gcc 具有允许更舒适地编写此类内容的扩展,即带有({ any code here })typeof 的块表达式来声明与宏参数相同类型的辅助变量。

【讨论】:

  • 为什么你认为@CatPlusPlus 是she
  • 我为什么要假设它是一个he? (但也许我受母语影响太大了,“猫”是女性的性别。)
  • @JensGustedt 嘿,在法语中,“猫”是男性。如果你用女性形式说的话,你可能会说一些不太礼貌的话......
【解决方案3】:

LLVM Clang3.3 引入了函数重载。事实上,函数重载可能不像你想象的那么容易。它涉及到函数调用约定和ABI(Application Binary Interface)等问题。当您将 C 代码与汇编语言混合使用时,可能会出现这些问题。 使用汇编过程时,不应重载导出过程的名称。

在 LLVM Clang 中,您可以使用属性(可重载)来做到这一点:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多