【问题标题】:Is there a way to define a function with an implementation with a different name?有没有办法用不同名称的实现来定义函数?
【发布时间】:2020-07-12 19:40:58
【问题描述】:

我在标头中有一个函数,需要实现该函数才能使其余代码正常工作。通常我会在包含标头后在main.c 中实现此功能,链接器将清理其余部分。

例如假设这个函数是void foo(bool); in foo.h

如果我有另一个函数作为与任务完全匹配的其他代码的一部分实现,假设void bar(bool); 在某些bar.hbar.c 中实现

我通常会通过包含bar.h 和做来将两者联系起来

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

如果有很多这些,基本上只是很多一行函数,用于告诉函数调用不同的函数。

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

【问题讨论】:

  • 重构代码以不使用foo开头?
  • 在 c99 中,您可以将 foo 作为 foo.h 中的内联函数。否则 #define foo bar 可能会产生不良影响
  • 我想在某种设置函数中重构使用传递给foo.c的函数指针作为一种选择是有意义的。
  • 我真的认为你应该退后一步,问问自己这个问题:为什么你需要foobar?除了名字,它们之间有什么区别?调用foo 与调用bar 的目的是什么?
  • 这听起来像X-Y-problem。你真的想完成什么? -- 由于您标记了 GCC,您可能想尝试链接器选项--wrap

标签: c gcc c99


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2013-09-11
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多