typedef函数作为另一个函数的参数

时间:2013-08-27 04:13:41

标签: c syntax

typedef int (xxx)(int yyy);表示定义一个用整数参数命名xxx的函数。有关详细信息,请参阅此SO post

我尝试过不同的方法,那是我的代码:

#include<stdio.h>
#include<stdlib.h>
typedef int (xxx)(int yyy);

void f1(xxx a)
{
    printf("f1:%d\n",a);
}
void f2(xxx *a)
{
    printf("f2:%d\n",a);
}
int test(int y)
{
}
int main()
{
    xxx *a;
    f1(test);
    f1(a);
    f2(test);
    f2(a);

    xxx b;
    printf("xxx's size:%d\n", sizeof(b));
}

输出:

f1:4199274
f1:2
f2:4199274
f2:2
xxx's size:1

我的问题:

  1. f(xxx a)f(xxx *a)相同?
  2. sizeof(someFunction)是否已定义?

1 个答案:

答案 0 :(得分:8)

  

表示定义一个名为xxx

的函数

它定义了一个函数 type

  

f(xxx a)与f(xxx * a)相同?

是。但这有点像语言中的黑客。这颗星很适合你,因为它不见了。

  

sizeof(someFunction)是否已定义?

具体而言不是。您可以使用汇编语言,或者通过使用关于程序如何链接的深入知识来执行此操作,但它对C没有语义含义。除了间接跳转之外,函数甚至不需要可寻址,因为C支持哈佛架构机器。 (另请注意,具有相同类型的两个函数通常具有不同的大小,因为大小由其指令的数量和性质决定。)

C11 6.3.2.1/4说

  

函数指示符是具有函数类型的表达式。除非它是sizeof运算符的操作数,...具有类型''函数返回类型''的函数指示符将转换为具有类型''指向函数返回类型'的指针的表达式。

和6.5.3.4/1说

  

sizeof运算符不应用于具有函数类型...

的表达式

您的编译器似乎未能应用6.3.2.1/4。需要输入错误消息。