【发布时间】:2015-03-26 01:50:36
【问题描述】:
我一直在研究一些代码,遇到了一些我理解的代码,但我想不出为什么会这样。
我在下面的代码中重现了这种情况:
include <stdio.h>
void printsum(int x, double y)
{
printf("Soma: %.2f\n", (double)x + y);
}
typedef int int_alias;
typedef void (* funcptr) (int_alias x, double y);
typedef void (* fptr) (int x, double y);
fptr pptr = &printsum;
#define A_MACRO(x, y) ((funcptr) (pptr)) (x, y)
int main()
{
int a = 10;
double b = 2.2;
A_MACRO(a, b);
/* ((funcptr) (pptr)) (a, b); */
return 0;
}
这是在事件发生并调用宏时完成的,因此打印函数是一个回调函数。
我不明白的是由于宏而发生的转换,据我所知pptr 已经是一个指向函数的指针,那么为什么要再次转换为funcptr 呢?
我对这种结构不是很熟悉,所以也许是我缺少的东西,谁能给我一些关于这个的信息?
【问题讨论】:
-
我认为没有这个转换结果会是一样的。
-
这看起来很奇怪...你能分享原始代码的链接吗?
-
即使
#define A_MACRO(x, y) (pptr)(x, y)也可以。无需铸造。可能在这种情况下这样做是为了提高代码的可读性。 -
@mafso 不是真的,这是很多代码,不是我的...
-
要给出有用的答案,我们可能需要更多信息。 (顺便说一句,你认识作者吗?)代码是从一开始就这样写的吗? (这样的事情可能是合并代码的结果。)我很想标记这个问题,没有代码很难以问答形式回答,讨论板可能更合适。
标签: c casting callback function-pointers