2013-05-11 87 views
2

林试图链接到使用指针给它的外部函数。但每次尝试时,我都会收到编译器错误,说明extern函数未声明。我几乎没有外部功能的经验,所以看不到我的错误。我有一个函数在lcd.c中声明,我试图从一个单独的文件memory.c中获取。访问使用函数指针外部函数用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); 

我编译在Linux上使用GCC薄荷

的代码,并得到错误

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) 

编辑

继承人的生成文件:只有

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,所以我已经削减了它n至只是部分

+1

显示你的'makefile'请。 – prehistoricpenguin 2013-05-11 11:08:23

+0

你不需要明确地使用'extern'。 – 2013-05-11 11:13:14

+0

@StefanoSanfilippo是的,这是真的,默认情况下,所有的功能都的extern,但应该没有问题,通过显式声明函数为extern – 2013-05-11 11:15:40

回答

0

如果你看看memory.cgcc -E memory.c)预处理后的版本的LCD_dataline_Rlcd.h声明丢失,我认为。这很可能是由一些#if#ifdef#ifndeflcd.h引起的。

+0

我这样做了,结果证明是这个问题。我确实有一些预处理器代码,我的LCD拼写错误,因为我的#ifdef中有一个LDC。不能相信这是一个简单的错误。现在一切正常。感谢大家的帮助。 – Scott 2013-05-11 18:21:07

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; 

在编译,

的gcc -c foo.c的bar.c

,我收到了类似的错误:

bar.c:3: error: 'foo' undeclared here (not in a function)