不是为函数声明函数指针typedef,而是可以从函数声明中获取它吗?
典型地,
int foo(int x);
typedef int (*fooFunc)(int);
fooFunc aFunc;
我想要的是什么:
int foo(int x);
foo* aFunc;
我想将它用于dlsym:
foo* aFunc;
aFunc = dlsym(lib, "foo");
aFunc(x);
如果我更新foo并忘记更新fooFunc,反之亦然,那就不好了。另外,我可能有很多函数,维护函数声明和与这些函数关联的函数指针typedef会更有效。
结论: AndreyT的答案是最便携的,但如果您编写gcc代码,那么typeof就是一个很好的解决方案。
答案 0 :(得分:6)
如果您具体谈论声明,即函数的非定义声明,您可以通过为函数类型定义typedef-name并在两种情况下使用它来删除冗余 - 声明函数本身并声明指向它的指针,就像这个
typedef int FuncType(int); /* <- function type */
FuncType foo; /* <- declaration of `int foo(int)` */
FuncType *aFunc; /* <- definition of `int (*aFunc)(int)` */
即。 typedef-names可用于非定义函数声明。但是,您不能在函数 definition 中使用typedef名称,这意味着以后您仍然需要执行
int foo(int x) /* <- no way to use the above `FuncType` here */
{
/* whatever */
}
这基本上使得上述技巧几乎无用。
当然,如果这是您的情况,这对您生成现有不可修改函数声明的指针没有帮助。
答案 1 :(得分: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;
}
$ /usr/bin/gcc -std=c89 -pedantic -Wall -Wextra -o fxf fxf.c fxf.c:3: warning: unused parameter ‘argv’
$ ./fxf main() called. main() called.
答案 2 :(得分:2)
简单回答:不,那不行。 foo
是特定的函数,它具有原型(int (int)
)。以您的方式使用foo
有点像使用int
来声明另一个int
:
4 x; // expect this to be the same as int x
也就是说,可能会有编译器扩展使其工作。我知道即将推出的C ++标准将允许使用decltype
关键字。使用它,以下可能工作(未经测试,因为我没有方便的支持编译器):
int foo(int x);
decltype(&foo) aFunc = dlsym(lib, "foo");
答案 3 :(得分:0)
这是不可能的。但是,您可以编写一些会生成警告的代码,以便捕获类型不匹配。以下代码根据不兼容的指针类型警告生成一个赋值。
#include <stdio.h>
int foo(int, int);
typedef int(*fooFunc)(int);
fooFunc myfunc;
int foo(int x, int y)
{
return 2*x + y;
}
int main(int argc, char **argv)
{
myfunc = foo;
printf("myfunc : 0x%x\n", (unsigned int)myfunc);
return 0;
}
当然,这意味着您必须在foo函数可见的情况下编写此测试代码,因此这仍然需要为每种函数类型添加更多代码。这里的解决方案可能是一个代码生成器,它会生成一个包含这两个函数及其相关typedef的正确头文件
答案 4 :(得分:0)
不完全相同,但您可以键入def函数并将其用于原型和指针。
typedef int fooFunc(int);
fooFunc foo;
fooFunc *aFunc;