谁能给我简单讲一下头文件包含的知识

sensorLike 2012-11-15 11:27:00
写了一个二项堆,共三个文件main.c(调试用),binoheap.c,binoheap.h。

/*
* main.c
*/
#include "binoheap.h" // 这样包含就连接错误,删了工程再建还是一样
#include "binoheap.c" // 这样就没问题,为什么?
/*
错误提示:
main.obj : error LNK2001: unresolved external symbol "struct tagBinoHeap __cdecl binomial_heap_insert(struct tagBinoHeap,struct tagBinoNode *)" (?binomial_heap_insert@@YA?AUtagBinoHeap@@U1@PAUtagBinoNode@@@Z)
main.obj : error LNK2001: unresolved external symbol "struct tagBinoHeap __cdecl make_binomial_heap(void)" (?make_binomial_heap@@YA?AUtagBinoHeap@@XZ)
Debug/binoheap.exe : fatal error LNK1120: 2 unresolved externals
*/

int main(void)
{
//...
}


/*
* binoheap.c
*/
#include "binoheap.h"
// 各种函数实现


/*
* binoheap.h
*/
#include <stdlib.h>
// include其他头文件
// 各种声明

/////////////////////////////////////////////////


// 然后我写了一个简单的int型加法函数测试了一下,包含.h和.c都是可以的,为什么。
...全文
282 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tag180 2012-11-16
  • 打赏
  • 举报
回复
看来看去发现自己最不严谨,懒得改了,,,楼主将就着参考参考吧。。。 看看mpich 的 mpi.h 参照着写就OK了。。。
tag180 2012-11-16
  • 打赏
  • 举报
回复
,,,仔细一看我楼上那个留言。居然把__cplusplus写错了。。。 真崩溃,没有高亮的编辑器就是个悲剧啊。。 我百度的关键字是 #if defined __cplusplus 真的。。。 博文已经将的挺清楚了 就是 “// 在这里写标准C程序,例如dll导出函数的定义”这句话不严谨,里面应该放函数的声明。。。
tag180 2012-11-16
  • 打赏
  • 举报
回复
引用 9 楼 buxiaotanke 的回复:
我找到问题了,我的main是cpp文件,binoheap是c文件,难怪一直链接不了。谢谢楼上各位的解答
手头上没有现有的说明文档 就直接百度了下__cpulsplus.... 楼主可以看看这个博文http://blog.sina.com.cn/s/blog_69fc9ee001010b90.html “// 在这里写标准C程序,例如dll导出函数的定义” 改成 //在这里声明C函数。。。 看见楼主发的问题误解了。。。 楼主有兴趣可以看看mpich的头文件mpi.h 写的非常标准。
转角天边 2012-11-16
  • 打赏
  • 举报
回复
1楼正解,声明放在头文件,实现放在.c文件,加上#ifndef防止重定义
sensorLike 2012-11-16
  • 打赏
  • 举报
回复
我找到问题了,我的main是cpp文件,binoheap是c文件,难怪一直链接不了。谢谢楼上各位的解答
sensorLike 2012-11-16
  • 打赏
  • 举报
回复
引用 3 楼 Geterns 的回复:
无法解析的外部链接这个问题通常出在跨文件引用全局变量/调用函数上面,我举个简单的例子告诉你怎样正确地进行外部链接(我用C++写的,但是原理和C是一样的)。 1.头文件head1.h C/C++ code?12extern int global_var;void do_nothing(); 2.源文件sc.cpp,这个文件定义全局变量和一个函数 C/C++ code……
我没有定义全局变量,什么是跨文件调用函数,我看不太懂,能讲明白一点吗?
sensorLike 2012-11-16
  • 打赏
  • 举报
回复
引用 1 楼 tag180 的回复:
把声明放在头文件里,实现放在.c文件里 头文件用 M-x auto-insert保护(就是那个#ifndef #define #endif 之流的那个保护符。。。好久没有写这个了,都是用EMACS自动生成的,忘记具体怎么拼了,教科书里都有) main函数包含用户“.h“文件和系统<.h>文件 例子:main.c fun.c fun.h fun.h内容……
我写了,不是这个问题
wei20092069 2012-11-16
  • 打赏
  • 举报
回复
预处理指令的作用有文件包含、条件编译、宏定义 #include即所谓的文件包含,#include<xxx.xx>相当于把文件xxx.xx的内容直接写到这个位置, 楼主你将binoheap.c,binoheap.h的内容直接写到#include的位置会发生什么呢?
swordtan 2012-11-16
  • 打赏
  • 举报
回复
看看3楼的吧,楼主的问题诡异了点
Geterns 2012-11-16
  • 打赏
  • 举报
回复
无法解析的外部链接这个问题通常出在跨文件引用全局变量/调用函数上面,我举个简单的例子告诉你怎样正确地进行外部链接(我用C++写的,但是原理和C是一样的)。 1.头文件head1.h
extern int global_var;
void do_nothing();
2.源文件sc.cpp,这个文件定义全局变量和一个函数
#include "head1.h"

int global_var = 100;

void do_nothing(){
}
3.源文件main.cpp,这个文件使用了文件sc.cpp中定义的全局变量和函数
#include <iostream>
#include "head1.h"
using namespace std;

int main(){
	do_nothing();
	cout << global_var << endl;

	return 0;
}
以上就是典型的外部引用函数和变量的方法。 另外补充几点: 1、编译的时候,编译器只会把各个源文件(*.c *.cpp)编译成二进制文件,然后链接成exe文件,这个你应该知道吧。就是说其实头文件(*.h)只是起到辅助作用。 2、#include这个预编译命令。其实很简单,在文件sc.cpp中#include "head1.h"就是在预编译的时候把head1.h中的所有代码照搬到sc.cpp中这个位置。#include另外一个源文件,这种做法或许可以让你的代码编译通过,但是极度不推荐。 3、更深层次一点东西:如何声明外部链接。 首先是函数,在一个源文件中,如果一个函数只有声明没有定义,编译器就认为这个函数引用自其他文件,比如上面那个例子中,main.cpp在include了head1.h之后,就有了函数do_nothing的声明,而没有定义。 而对于变量,变量的声明+定义其实是一起完成的,所以用extern关键字来修饰——在一个源文件中,如果某一个变量只有extern声明,编译器就认为这个变量来自其他文件。例如上面的例子,main.cpp在include了head1.h之后,就有了变量extern声明extern int global_var; 但是没有正常的int global_var;声明+定义,所以编译器知道这个变量来自其他文件。
tag180 2012-11-16
  • 打赏
  • 举报
回复
回看了一下#ifndef #define 里有点错 应该是 #ifndef FUN_H #define FUN_H ....
tag180 2012-11-16
  • 打赏
  • 举报
回复
把声明放在头文件里,实现放在.c文件里 头文件用 M-x auto-insert保护(就是那个#ifndef #define #endif 之流的那个保护符。。。好久没有写这个了,都是用EMACS自动生成的,忘记具体怎么拼了,教科书里都有) main函数包含用户“.h“文件和系统<.h>文件 例子:main.c fun.c fun.h fun.h内容: #ifndef #define /*楼主查查书,看看保护符 拼写对不对。手头没有容易获取的资料。。。。*/ void fun() #endif fun.c内容 #include <stdlib.h> void fun() { printf("aaaaaaaaaa"); /*好久没写C了。。。printf都不会用了。。楼主自己改对哈*/ } main.c内容 #include "fun.h" int main(int argc, char *argv[]) { fun(); return 0; }

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧