我可以重新定义一个函数或检查它是否存在?

Tim*_*Tim 9 c function

我有一个关于(重新)定义函数的问题.我的目标是有一个脚本,我可以选择定义一个函数.像这样:

void func(){}

int main(){
   if (func)func();
}
Run Code Online (Sandbox Code Playgroud)

没有这个功能,只需:

int main(){
   if (func)func();
}
Run Code Online (Sandbox Code Playgroud)

有人有想法吗?

bdo*_*lan 16

您可以使用其弱函数属性扩展在GCC中执行此操作:

void func() __attribute__((weak)); // weak declaration must always be present

int main() {
  if (func) func();
  // ...
}

// optional definition:
void func() { ... }
Run Code Online (Sandbox Code Playgroud)

即使func()在另一个.c文件或库中定义,这也可以工作.

  • 哦,看起来其他一些编译器也支持它并使用 `#pragma weak`。http://en.wikipedia.org/wiki/Weak_symbol (2认同)
  • @R,我在我自己的一些代码中以这种方式使用它; 它似乎无论如何都适用于Linux.GCC无法优化`if(func)`,除非在同一个编译单元中确实存在定义,因为它不知道某个定义是否由其他编译单元或共享库提供,等等 (2认同)
  • @Brian:这就是评论和文档的用途. (2认同)

JAB*_*JAB 5

我认为,这样的事情.没有多少使用函数指针,所以我的语法可能略有错误.

  void func()
  {
#define FUNC_PRESENT
      // code
  }

  void (*funcptr)();

#ifdef FUNC_PRESENT
      funcptr = func;
#else
      funcptr = NULL;
#endif

  int main()
  {
      if (funcptr)
          funcptr();
  }
Run Code Online (Sandbox Code Playgroud)

  • +1:虽然我会小心地在函数定义中"词汇"里面写"#define".我知道你正在尝试将代码捆绑在一起,因此它不易出错,但它可能会误导一些编码人员将PP定义视为仅在调用`func()`时才会发生的事情.[编辑:或者它可能误导程序员认为_you_认为,像上面的Brian一样] (4认同)