Доступ к внешней функции с помощью указателя функции в C

Я пытаюсь установить ссылку на внешнюю функцию, используя указатель на нее. Но каждый раз, когда я пытаюсь, я получаю ошибки компилятора о том, что функция extern не объявлена. У меня мало опыта работы с внешними функциями, поэтому я не вижу своей ошибки. У меня есть функция, объявленная в lcd.c, которую я пытаюсь получить из отдельного файла memory.c.

Мне нужно использовать указатели функций, когда я пишу эмулятор, и у меня есть массив адресов памяти, где каждый элемент массива ссылается на аппаратную функцию, вызываемую при обращении к этому адресу памяти. В основном позволяя мне делать:

    UINT8 WriteMem(int address, UINT8 data) {
      return memory[address](data);
    }

Вот мой код, с которым у меня проблемы:

lcd.c

    UINT8 LCD_dataline_R(UINT8 data) {
      // Some code
      return aValue;
    }

lcd.h

    extern UINT8 LCD_dataline_R(UINT8 data);

memory.c

    #include "lcd.h"
    typedef UINT8 (*MemFunct)(UINT8 data);
    MemFunct ReadDataLine = LCD_dataline_R;
    .
    .
    UINT8 recieved = ReadDataLine(0x80);

Я компилирую код с помощью GCC на Linux Mint

и получите ошибку

    Running command: make -f makefile memory.o
    gcc -c -Wall memory.c
    memory.c:3:25: error: ‘LCD_dataline_R’ undeclared here (not in a function)

Редактировать

Вот make-файл:

    CC=gcc
    CFLAGS=-Wall -std=c99 `sdl-config --cflags` `pkg-config --cflags gtk+-2.0`
    LIBS=`sdl-config --libs` `pkg-config --libs gtk+-2.0`

    all: psiora clean

    memory.o: memory.c psiora.c lcd.c
        $(CC) -c $(CFLAGS) $^

    clean:
        rm -rf *o psiora

Я только пытаюсь скомпилировать memory.o на данный момент, поэтому я сократил его только до этой части


person Scott    schedule 11.05.2013    source источник
comment
Покажи свой makefile, пожалуйста.   -  person prehistoricpenguin    schedule 11.05.2013
comment
Вам не нужно явно использовать extern.   -  person Stefano Sanfilippo    schedule 11.05.2013
comment
@StefanoSanfilippo Да, это правда, по умолчанию все функции являются внешними, но не должно быть проблем, если явно объявить функции как внешние   -  person Barath Ravikumar    schedule 11.05.2013
comment
Покажите автономный компилируемый код, демонстрирующий проблему.   -  person Eric Postpischil    schedule 11.05.2013
comment
что, если вы попробуете lcd.h вместо lcd.c в memory.o?   -  person Markon    schedule 11.05.2013


Ответы (2)


Я думаю, если вы посмотрите на предварительно обработанную версию memory.c (gcc -E memory.c), что объявление LCD_dataline_R из lcd.h отсутствует. Скорее всего, это вызвано какими-то #if, #ifdef или #ifndef в lcd.h.

person Bryan Olivier    schedule 11.05.2013
comment
Я сделал это, и оказалось, что это была проблема. У меня действительно был некоторый код препроцессора, в котором я неправильно написал LCD, как LDC в одном из моих #ifdef. Не могу поверить, что это была такая простая ошибка. Теперь все работает нормально. Спасибо всем за помощь. - person Scott; 11.05.2013

Я не знаю, что не так с вашей программой, но вот пример ситуации, которая может воспроизвести аналогичную ошибку.

foo.h:
extern void foo(int a);

foo.c:
#include "foo.h"
void foo(int a)
{    
}

bar.c:
//#include "foo.h"  --> Uncomment to remove error
typedef void(*fptr)(int a);
fptr fooptr=foo;

При компиляции

gcc -c foo.c bar.c

я получаю аналогичную ошибку:

bar.c:3: error: 'foo' undeclared here (not in a function)
person Barath Ravikumar    schedule 11.05.2013