有没有一种方法可以定义具有不同名称的实现的函数?

时间:2020-04-01 05:47:17

标签: c gcc c99

我在标头中有一个函数,其余代码才能正常运行。通常,在包含标题之后,我将在main.c中实现此功能,链接器将清除其余的内容。

例如,假设此函数是void foo(bool);中的foo.h

如果我在与任务完全匹配的其他代码中实现了另一个功能,则可以假设void bar(bool);是在某些bar.hbar.c中实现的

我通常会通过包括bar.h和这样做

来链接两者
void foo(bool var) {
    bar(var);
}

如果有很多的话,基本上就是很多单行函数来告诉函数调用另一个函数。

有其他方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

void foo(bool var) {
    bar(var);
}

该函数是全局函数,或者不是全局函数。您必须做出决定;不能同时拥有。

如果只是标头中的包装,则可以将其设为静态内联:

// bar.h
static inline void foo (bool var)
{
    bar (var);
}

很明显,您不能将其与foo.h中的不同定义/声明一起使用。

如果只希望将名为foo的函数使用bar作为程序集名称,则可以使用GNU-C中的以下C扩展名:

// bar.h
void foo (bool) __asm ("bar");

这意味着bar将是foo的程序集名称。这可以避免额外的呼叫步骤。当然,也不能将其与foo的定义/声明冲突。还要注意,您可能必须调整程序集名称,例如,i386平台通常使用前导_(下划线),因此您必须使用程序集名称_bar。对于C ++,您需要使用乱码。

底线:在每个编译单元(模块)中,您必须决定 您要使用的foo的实现,并取决于此实现,包括foo.h或冲突的bar.h