我有4个文件:
main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "main.h"
int main() {
struct Fun *fun = (struct Fun*)malloc(sizeof(struct Fun));
fun->a = 2;
fun->b = 12;
fun->Func = Plus();
int result = fun->Func(fun, 8);
printf("%d\n", result);
return 0; }
main.h
#ifndef MAN_H_
#define MAN_H_
struct Fun {
int a;
int b;
int (*Func)(struct Fun *x,int y);
};
header.c
#include "header.h"
int Plus(struct Fun *x, int y) {
return x->a * x->b + y; };
header.h
#ifndef HEADER_H_
#define HEADER_H_
#include "man.h"
#endif /* HEADER_H_ */
当我建立时,我收到警告:
../ main.c:12:5:警告:隐式声明函数'Plus'[-Wimplicit-function-declaration] ../main.c:12:15:警告:赋值来自整数的指针,没有强制转换[默认启用]
如果我跑,它没有结果。
但是当我将所有代码都放到main.c并将fun->Func = Plus();
编辑为fun->Func = Plus;
时,它工作正常:没有警告,结果是32。
答案 0 :(得分:4)
您应该在 header.h 中为Plus
提供功能签名,并在 main.c 中添加#include "header.h"
,以便在{em> main.c 中使用Plus
函数时,我们已经了解了int Plus(struct Fun *, int);
函数。
在 header.h :
fun->Func = Plus();
如果没有这样的签名,在编译 main.c 时,编译器会对函数做出假设:隐式声明。此隐式声明与实际函数定义不匹配。
此外,仍然需要将fun->Func = Plus;
更改为#endif
:第一种形式为函数指针指定尝试函数调用的结果,第二种形式是分配函数指针的正确方法。
最后,这可能只是一个剪切/粘贴遗漏,但 main.h 缺少{{1}}。