功能声明中是否有C语法的功能指针

Kla*_*ing 4 c typedef function-pointers

而不是为函数声明函数指针typedef,是否可以从函数声明中获取它?

通常情况下,

int foo(int x);
typedef int (*fooFunc)(int);
fooFunc aFunc;
Run Code Online (Sandbox Code Playgroud)

我想要的是:

int foo(int x);
foo* aFunc;
Run Code Online (Sandbox Code Playgroud)

我想将它用于dlsym:

foo* aFunc;
aFunc = dlsym(lib, "foo");
aFunc(x);
Run Code Online (Sandbox Code Playgroud)

如果我更新foo并忘记更新fooFunc,反之亦然,那将是不好的.此外,我可能有许多函数,维护函数声明和与这些函数关联的函数指针typedef会更加有效.

结论:AndreyT的答案是最便携的,但如果您编写gcc代码,那么typeof是一个很好的解决方案.

AnT*_*AnT 6

如果你正在谈论一个特定的声明,即一个函数的非定义声明,你可以通过为函数类型定义一个typedef-name并在两种情况下使用它来删除冗余 - 声明函数本身并声明一个指针对它,像这样

typedef int FuncType(int); /* <- function type */
FuncType foo; /* <- declaration of `int foo(int)` */
FuncType *aFunc; /* <- definition of `int (*aFunc)(int)` */
Run Code Online (Sandbox Code Playgroud)

即typedef-names可用于非定义函数声明.但是,您不能在函数定义中使用typedef名称,这意味着以后您仍然需要这样做

int foo(int x) /* <- no way to use the above `FuncType` here */
{
  /* whatever */
}
Run Code Online (Sandbox Code Playgroud)

这基本上使上述技巧几乎无用.

当然,如果这是您的情况,这不会帮助您从现有的不可修改的函数声明生成指针.


pmg*_*pmg 5

如果你有gcc,typeof工作.

更新

$ cat fxf.c
#include <stdio.h>

int main(int argc, char **argv) {
  typedef __typeof__ (main) function_of_same_type_as_main_t;
  function_of_same_type_as_main_t *f;

  printf("main() called.\n");
  f = main;
  if (argc) f(0, NULL);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)
$ /usr/bin/gcc -std=c89 -pedantic -Wall -Wextra -o fxf fxf.c
fxf.c:3: warning: unused parameter ‘argv’
$ ./fxf
main() called.
main() called.

  • 这不是"C语法",你似乎在你的问题中谈到了这个问题. (3认同)