【问题标题】:Is there an alternate syntax to typedef function pointers?typedef 函数指针是否有替代语法?
【发布时间】:2015-11-11 00:15:06
【问题描述】:

为了给函数指针做 typedef,我们做这样的事情,

typedef int (*func) (char*);
typedef struct{
  char * name;
  func f1; 
}

与此相反,我遇到了一个我不明白的代码。

typedef int rl_icpfunc_t (char *);
typedef struct {
   char *name;         /* User printable name of the function. */
   rl_icpfunc_t *func; /* Function to call to do the job. */
   char *doc;          /* Documentation for this function.  */
}COMMAND;

这是来自 libedit 库示例的代码 sn-p。有人可以向我解释一下吗?

【问题讨论】:

  • 它是一个带char*参数的int函数。

标签: c function-pointers typedef


【解决方案1】:

使用 typedef int rl_icpfunc_t (char *); 是否正确?

是的,这意味着rl_icpfunc_t 是一个函数,它接受一个指向char 和return 和int 的指针。 您可以使用rt_icpfunct_t 代替普通类型,因此rl_icpfunc_t *func 表示func 是指向rt_icpfunct_t 类型函数的指针

【讨论】:

  • 不同之处在于,在第二种情况下,在执行 typedef 时使用 rl_icpfunc_t 而不是 (*rl_icpfunc_t)。然后它被用作 rl_icpfunc_t * func,而不是 rl_icpfunc_t func。这就是我怀疑的地方。这是允许的吗?或者它是否意味着不同的东西?
  • 您有什么不清楚的地方? struct COMMAND 中声明的函数指针?
  • 是的,我的意思是问使用 typedef int rl_icpfunc_t (char *); 是否正确?
  • 我想是的,这意味着rl_icpfunc_t 是一个函数,它接受一个指向char 和return 和int 的指针。您可以使用rt_icpfunct_t 代替普通类型,因此rl_icpfunc_t *func 意味着func 是指向rl_icpfunc_t 类型函数的指针
【解决方案2】:
typedef int rl_icpfunc_t (char *);

将函数原型定义为类型。

rl_icpfunc_t * func; 

func定义为指向前者的指针。

这与直接通过以下方式定义函数指针类型相反:

typedef int (*prl_icpfunc_t) (char *);
prl_icpfunc_t func;

两种方法的结果是一样的:一个指针func,指向一个返回int的函数,并接受一个参数,即char*

【讨论】:

  • 你能解释一下吗?你是说第二种情况是错误情况?
  • @Ankit:定义函数指针的两种方法都是有效的。
  • 这种(前)语法不仅合法——我认为它优于typedef函数指针的更常见方式(后一个例子)——因为它保留了指针的特征之后的类型声明(类似的问题:typedef 指向普通数据类型的指针也被认为是不好的做法......)。
  • @Aconcagua:“这个(前)语法”是非法的吗?您的 C11 编译器会发出哪些警告/错误?
  • @alk “不仅合法,而且更优越” 我表达自己的态度不好吗?
猜你喜欢
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2013-09-09
相关资源
最近更新 更多