【发布时间】:2019-02-04 13:32:48
【问题描述】:
我正在努力使用工会。为什么我无法将函数指针传递到联合所在的位置?任何帮助将不胜感激。
编辑:删除 typedef
#include <stdio.h>
union U {
int(*fnPtr)(int);
int i;
};
enum E {
OPTION_0 = 0,
OPTION_1 = 1
};
int multiply_by_two (int x) {
return 2 * x;
}
int f (int x, enum E e, union U u) {
switch (e) {
case OPTION_0:
/* Return the sum */
return x + u.i;
case OPTION_1:
/* Return 2 * x */
return u.fnPtr (x);
}
}
int main (void) {
int a;
scanf ("%d", &a);
int b = f (a, OPTION_1, &multiply_by_two);
printf ("%d\n", b);
return 0;
}
【问题讨论】:
-
另外,看看this问题。
-
union U不是int(*fnPtr)(int)。union U有一个该类型的成员。 -
抱歉,typedef 是一个错误,是从内存中输入的:/我已经删除了它
-
@Z4ckZ3r0 通常,从不重新输入代码。只需复制并粘贴您正在运行的内容。一个小小的改动就可以在功能代码和非功能代码之间产生很大的不同。
-
发布的代码,当通过编译器 (gcc) 运行时会导致: gcc -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled2.c" : In function 'main ': :31:29: 错误:'f' int b = f (a, OPTION_1, &multiply_by_two) 的参数 3 的类型不兼容; :17:5:注意:预期的'union U',但参数的类型是'int(*)(int)' int f(int x,enum E e,union U u){:在函数'f'中::26 :1: 警告:控制到达非空函数 [-Wreturn-type] } 编译失败。