struct中的指针函数

时间:2012-09-27 14:48:52

标签: c

我有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。

1 个答案:

答案 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}}。