包含另一个.h文件只能查看我的结构,但不能查看我的函数

时间:2014-02-11 19:25:43

标签: c include ifndef

为了简化,假设我有一个带有以下内容的Page.h文件......

#ifndef PAGE_H
#define PAGE_H

typedef struct Pgmap{
    int test;
}Page;

void printPage();
#endif

Page.c定义printPage()并具有...

#include "Page.h"

而且,我有另一个使用上面结构/函数的.c / .h文件。

在Test.h中我......

#include "Page.h"

,我的Test.c已经

#include "Test.h"

此时我可以使用我的Page结构,但是当我尝试使用printPage()时,在尝试编译时,我得到一个“未定义的'printPage()'错误引用。

那么为什么我的包括结构的工作,而不是函数?如果它有所不同,我的gcc是gcc(SUSE Linux)4.6.2

2 个答案:

答案 0 :(得分:0)

它的工作原理是头部包含结构的声明,但函数的代码在C文件中。您需要将已编译的C文件(称为“对象文件”)链接在一起。

例如,将“Page.c”编译为“Page.h”,然后在构建“Test.c”时,将其与“Page.o”链接起来,因为需要该模块的功能。

在C中,只是因为你的C文件中有#include "something.h",编译器不会自动知道如何找到标题中声明的事物的定义(例如任何函数或外部变量)。

编译器只看到标题的文本,基本上粘贴到#include发生的位置。找到代码没有神奇的方法。您可能甚至没有拥有相应的C文件,因为C支持分发二进制文件,即预编译的库。

答案 1 :(得分:0)

我最好的猜测是,你没有链接到包含printPage()的模块。

编译模块时,编译器只根据标头知道存在的内容。从头文件中可以知道结构的布局,但函数的内容是未知的。

在链接应用程序时,您必须确保包含其他模块。或者,使printPage()成为内联函数。