1

私は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 です。

4

1 に答える 1

4

main.cで使用されたときに関数について何かがわかるようにPlusheader.hに関数シグネチャを提供し#include "header.h"main.cにも を追加する必要があります。Plus

header.hで:

int Plus(struct Fun *, int);

このような署名がない場合、main.cをコンパイルするときに、コンパイラは関数に関する仮定、つまり暗黙の宣言を行います。この暗黙の宣言は、実際の関数定義と一致しません。

また、fun->Func = Plus();への変更fun->Func = Plus;も必要です。最初の形式は、試行された関数呼び出しの結果を関数ポインターに割り当てます。2 番目の形式は、関数ポインターを割り当てる正しい方法です。

最後に、これは単にカット アンド ペーストの省略である可能性がありますが、main.hには#endif.

于 2012-09-27T14:51:56.633 に答える