English 中文(简体)
Is There Cix For Function Pointer From Function Declaration
原标题:Is There C Syntax For Function Pointer From Function Declaration
  • 时间:2009-11-04 16:43:24
  •  标签:

不是宣布职能单位类型,而是有可能从职能申报中删除?

典型的情况是,

int foo(int x);
typedef int (*fooFunc)(int);
fooFunc aFunc;

我想:

int foo(int x);
foo* aFunc;

我想用它来形容:

foo* aFunc;
aFunc = dlsym(lib, "foo");
aFunc(x);

如果我更新oo,并想更新 f,或反之,那将是坏的。 此外,我还可能有许多职能,并且将更加努力地保持职能申报以及与这些职能有关的职能点类型。

Conclusion: AndreyT s answer is the most portable but if you code for gcc then typeof is a great solution.

最佳回答

如果有,tof

<>Update>

$ 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.
");
  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.
问题回答

如果你谈论的是申报<>,具体地说,即不限定一项功能的声明,那么你可以删除多余之处,确定一种功能类型的名称,并在这两种情况下使用这种名称——宣布职能本身,并向其申报点名,就像这一名称一样。

typedef int FuncType(int); /* <- function type */
FuncType foo; /* <- declaration of `int foo(int)` */
FuncType *aFunc; /* <- definition of `int (*aFunc)(int)` */

I.e. 类型名称可在非界定功能声明中使用。 然而,你可以使用definition的一类名,意思是,以后你仍需做些什么。

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

这基本上使上述问题几乎毫无用处。

当然,如果你的情况,这无助于你从一份<>现有<><>不可调换功能声明”中找到一个点。

简单回答:没有,那就没有工作。 <代码>foo为specific功能,具有原型(int(int))。 使用<条码>foo 您这样做的方式是使用<代码>int宣布另一条<代码>int:

4 x; // expect this to be the same as int x

尽管如此,可能还有使这项工作得以完成的汇编延期。 我知道,即将出台的C++标准将具备以下关键词:decltype。 根据这一规定,以下工作might(未经测试,因为我没有辅助编辑手):

int foo(int x);

decltype(&foo) aFunc = dlsym(lib, "foo");

是不可能的。 然而,你可以撰写一些可引起警告的法典,以便你能够追捕类型的不匹配。 下面的法典从不兼容的点警报中产生转让。

#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
", (unsigned int)myfunc);
    return 0;
}

当然,这意味着,如果发现 f功能,你必须撰写这一测试守则,因此,对于每个功能类别来说,这仍然是更多的法典。 这里的解决办法可能是一种密码生成器,可生成包含功能及其相关类型的适当目录。

并非完全相同,但你可以把功能打上型号,并用于原型和点子。

typedef int fooFunc(int);
fooFunc foo;
fooFunc *aFunc;




相关问题