我尝试使用指向它的指针链接到extern函数。但每次我尝试,我都会收到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);
我正在Linux Mint上使用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)
修改
继承人makefile:
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所以我把它简化为那个部分
答案 0 :(得分:0)
我认为,如果您查看memory.c
(gcc -E memory.c
)的预处理版本,则LCD_dataline_R
的{{1}}声明将丢失。这很可能是由lcd.h
中的某些#if
,#ifdef
或#ifndef
引起的。
答案 1 :(得分: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)