1

我有 4 个文件:

主程序

#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; }

主文件

    #ifndef MAN_H_
    #define MAN_H_

    struct Fun {
        int   a;
        int   b;
        int (*Func)(struct Fun *x,int y);

    };

头文件.c

    #include "header.h"

    int Plus(struct Fun *x, int y) {
        return x->a * x->b + y; };

头文件.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。

4

1 回答 1

4

Plus您应该为in header.h提供函数签名,并在 main.c 中添加#include "header.h"一个函数签名,以便在main.cPlus使用该函数时了解该函数。

header.h中:

int Plus(struct Fun *, int);

如果没有这样的签名,在编译main.c时,编译器会对函数做出假设:隐式声明。此隐式声明与实际函数定义不匹配。

此外,更改fun->Func = Plus();fun->Func = Plus;仍然是必要的:第一种形式将尝试函数调用的结果分配给您的函数指针,第二种形式是分配函数指针的正确方法。

最后,这可能只是一个剪切/粘贴遗漏,但main.h缺少一个#endif.

于 2012-09-27T14:51:56.633 回答