1

あなたの助けを借りて、私は最終的に関数ポインターを使用してコードをコンパイルしました。しかし今、私はまったく同じことをしたいと思っていますが、「外部」ライブラリからの関数に対してです。typedef、引数、コンパイル フラグは 100% 正常です。外部ライブラリから関数を呼び出そうとした場合にのみ、この警告が表示されました (同じプロトタイプで関数を作成し、このコードでそれを呼び出そうとした場合は問題ありませんでした)。 . 何か案は?

#include <stdio.h>
#include <stdlib.h>
#include "libs/outlib.h"

typedef int (*VFUNCV)(int, double);

void call(int which, VFUNCV* fun, int a, double b)
{
    fun[which](a, b);
}

int main()
{
    VFUNCV fun[2] = {outlibfun1, outlibfun2};

    call(0, fun, 3, 4.5);
    return 0;
}

警告:

funargs.c: In function ‘main’:
funargs.c:14:5: warning: initialization from incompatible pointer type [enabled by default]
funargs.c:14:5: warning: (near initialization for ‘fun[0]’) [enabled by default]
funargs.c:14:5: warning: initialization from incompatible pointer type [enabled by default]
funargs.c:14:5: warning: (near initialization for ‘fun[1]’) [enabled by default]

そして14行目:

VFUNCV fun[2] = {outlibfun1, outlibfun2};

の宣言outlibfun:int outlibfun1(int, double);

別の動作しない (警告) 例:

#include <stdio.h>
#include <stdlib.h>
#include "libs/outlibz2.h"

typedef unsigned char* (*VFUNCV)(const unsigned char *, unsigned long, unsigned char *);

void call(int which, VFUNCV* fun, const unsigned char *a, unsigned long b, unsigned char * c)
{
    fun[which](a, b, c);
}

int main()
{
    VFUNCV fun[2] = {outlibfun1};

    call(0, fun, "b", 3, "a");
    return 0;
}
4

2 に答える 2

1

関数が同じソースで宣言されておらず、関数ポインターを割り当てる前に、次のような extern 宣言が必要な場合

extern int outlibfun1( int, double );

あなたの場合、あなたはそれらを持っているべきですlibs/outlib.h

于 2013-08-07T12:16:40.613 に答える
0

outlibfun1/outlibfun2 が同じ関数シグネチャを共有していないようです。物事を明確にするために、それらの定義を提供できます。

于 2013-08-07T12:17:05.513 に答える