函数指针 - 外部库,警告:从不兼容的指针类型初始化

时间:2013-08-07 12:08:42

标签: c function-pointers

在你的帮助下,我终于编译了一个带有函数指针的代码。但是现在我想做同样的事情,但对于来自“外部”库的功能。 typedef,arguments,compilation flags 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;
}

2 个答案:

答案 0 :(得分:1)

如果您的函数未在同一个源中声明,并且在分配函数指针之前,您需要一个extern声明,如

extern int outlibfun1( int, double );

在您的情况下,您应该在libs/outlib.h

中拥有它们

答案 1 :(得分:0)

看起来outlibfun1 / outlibfun2不共享相同的函数签名。 您可以提供他们的定义以澄清事情。