2013-05-11 5 views
2

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

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

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

Heres мой код им проблемы с:

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) 

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

Heres файл сборки: только

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 

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

+1

Показать ваш 'makefile' пожалуйста. – prehistoricpenguin

+0

Вам не нужно явно использовать 'extern'. –

+0

@StefanoSanfilippo Да, это правда, по умолчанию все функции extern, но не должно быть никаких проблем, явно объявляя функции extern –

ответ

0

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

+0

Я сделал это, и, оказывается, это была проблема. У меня действительно был некоторый препроцессорный код, где у меня был опечатанный LCD, как LDC в одном из моих #ifdef. Не могу поверить, что это была такая простая ошибка. Сейчас все работает отлично.Спасибо всем за помощь. – Scott

0

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

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; 

На компиляции

НКУ -c foo.c bar.c

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

bar.c:3: error: 'foo' undeclared here (not in a function) 
Смежные вопросы