Указатели функций - вне библиотеки, предупреждение: инициализация из несовместимого типа указателя

С вашей помощью я наконец скомпилировал код с указателями на функции. Но теперь я хотел бы сделать то же самое, но для функций из "внешней" библиотеки. typedef, arguments, флаги компиляции на 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;
}

person ivy    schedule 07.08.2013    source источник
comment
Какая подпись у outlibfun1 и outlibfun2?   -  person Tony The Lion    schedule 07.08.2013


Ответы (2)


Если ваша функция не объявлена ​​в том же источнике, и перед назначением указателя функции вам необходимо объявление extern, например

extern int outlibfun1( int, double );

В вашем случае они должны быть в libs/outlib.h

person Ingo Leonhardt    schedule 07.08.2013
comment
после добавления объявления extern я получил следующее: funargs.c:9:23: error: conflicting types for ‘outlibfun1’ libs/outlib.h:114:16: note: previous declaration of ‘outlibfun1’ was here - person ivy; 07.08.2013
comment
Что за строка 9? В любом случае ошибка показывает, что что-то не так с объявлением outlibfun1(). - person Ingo Leonhardt; 07.08.2013
comment
Я искал MD4() в заголовке «мой» (начиная с версии 0.9.8.a) и обнаружил, что вторым параметром является size_t вместо unsigned long. Это не обязательно одно и то же. - person Ingo Leonhardt; 07.08.2013
comment
Ну, вы инициализируете свой массив TEST_HMAC_FUN fun1[2] = {EVP_sha1, EVP_md5}, но EVP_sha1() и EVP_md5() const EVP_MD *EVP_...(void), что полностью отличается от HMAC() и вашего typedef - person Ingo Leonhardt; 08.08.2013

Похоже, что outlibfun1 / outlibfun2 не имеют одинаковой сигнатуры функции. Вы можете дать их определения, чтобы прояснить ситуацию.

person nikpel7    schedule 07.08.2013