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是一个很好的解决方案.
如果你正在谈论一个特定的声明,即一个函数的非定义声明,你可以通过为函数类型定义一个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)
这基本上使上述技巧几乎无用.
当然,如果这是您的情况,这不会帮助您从现有的不可修改的函数声明生成指针.
如果你有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.