【问题标题】:pointer function in struct结构中的指针函数
【发布时间】:2012-09-27 14:48:51
【问题描述】:

我有 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-&gt;Func = Plus(); 编辑为 fun-&gt;Func = Plus; 时,它工作正常:没有警告,结果是 32。

【问题讨论】:

  • 提示,不要投malloc的返回值。

标签: c


【解决方案1】:

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

header.h中:

int Plus(struct Fun *, int);

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多