【问题标题】:A typedef function as a parameter of another functiontypedef 函数作为另一个函数的参数
【发布时间】:2013-08-27 04:13:41
【问题描述】:

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) 是否已定义?

【问题讨论】:

  • 关于 (2),sizeof(function)sizeof(function-type) 都无效是 C。但是,sizeof(function-ptr-type) 完全没问题。在进一步评论之前,我必须检查标准以确认我对 (1) 的怀疑。

标签: c syntax


【解决方案1】:

表示定义一个名为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。需要一条错误消息。

【讨论】:

  • +1(以及您在 OP 问题中链接的精彩帖子,也获得了投票)。
  • 非常感谢..但我想知道,你怎么会知道这么多关于C语言的细节?并这么快就回答这个问题(我认为这很难..)?
  • 我使用 code::blocks IDE,首先是 mingw32-gcc.exe -c a.c -o a.o,然后是 mingw32-g++.exe -o a.exe a.o
  • @Sayakiss 使用 N1570 的副本,与官方 C11 标准相同。
  • @Potatoswatter 很棒的文档!我会仔细阅读。真的谢谢!!
猜你喜欢
  • 2022-01-11
  • 2016-07-21
  • 2018-11-13
  • 1970-01-01
  • 2018-07-30
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多