鱼C论坛

 找回密码
 立即注册
查看: 4705|回复: 7

求助C语言头文件的问题

[复制链接]
发表于 2013-2-7 15:28:25 | 显示全部楼层 |阅读模式
100鱼币
如果我想把我自己写的一些常用函数写在一个.c的文件中,再把全部函数声明在自定义的头文件中,然后写主程序的时候把自定义头文件include进来就可以使用了,该怎么做呢?

还有。。。VC系统中他的头文件又是怎么调用函数的呢?求详细解答~~赶鸡不尽

最佳答案

查看完整内容

系统调用流程?应该是这样吧。我不确定,不过这样应该可以实现 首先把源码和头文件编译成目标文件.obj 然后进行编译,编译成目标文件.obj 图中有符号文件是包含调试信息等,方便我们调试的,可以不用管 然后链接器会把多个OBJ链接成EXE,同时解析未定义的符号引用 解析过程中链接器会自动把需要的库文件LIB中的实现过程给复制一份过来便于调用 也就是以子程序(函数)的方式一起放进来链接 (也就是为什么s ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-7 15:28:26 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-2-7 18:30 编辑


系统调用流程?应该是这样吧。我不确定,不过这样应该可以实现

首先把源码和头文件编译成目标文件.obj

然后进行编译,编译成目标文件.obj
8.jpg
图中有符号文件是包含调试信息等,方便我们调试的,可以不用管

然后链接器会把多个OBJ链接成EXE,同时解析未定义的符号引用
解析过程中链接器会自动把需要的库文件LIB中的实现过程给复制一份过来便于调用


也就是以子程序(函数)的方式一起放进来链接
(也就是为什么stdio.h只有声明没有实现也可以用的原因)

解析过程中同样会将目标文件中的占位符替换为符号的地址
例如调用printf

汇编大概是call printf(当然目标文件中不是汇编而是机器码)
它会把printf替换成对应函数的地址,例如替换成 call 0040d760

然后一个EXE就这样出来了



大概就是这个样子,不过应该还会有一些复杂的操作,我也可能说错
仅供参考
解析未定义的符号引用,占位符替换为符号的地址这两句是我从资料中复制过来的
上面的替换我自己的理解,不清楚有没有理解对







小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 15:49:33 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-2-7 16:09 编辑

首先回答你的问题
还有。。。VC系统中他的头文件又是怎么调用函数的
你指的是类似stdio.h这些编译器自带的头文件是吗?
它们的头文件有些不同,只有定义,没有实现过程
实现过程存放在LIB库文件中
做法是这样的:通过定义告诉编译器这东西存在,源码中调用就不会报错
然后链接器链接时
会把实现过程从LIB中搞出来同其他文件链接成EXE,就可以调用了




.h才是头文件哦,.c是源代码
不过你写在.c也可以

那么就写.c好了
跟.h一样的
以VC6.0为例,其他IDE基本操作是一样的

首先用VC打开你的工作空间(英文版的应该是菜单中的Open Workspace吧?不清楚),vc6.0是.dsw后缀

附:如果你是直接用VC新建.c来编译没有工作空间的话,可以点新建->分页中选工程->WIN32 Console Application或者其他
创建一个工作空间后,再新建一个.c文件,或者直接将你之前的源文件添加进来(添加方法同下面的头文件添加方法一样)


然后右键Header Files 就是头文件的意思
1.jpg
点添加文件到目录
2.jpg
好了,给你.c文件取个可爱的名字吧
3.jpg
点确定,它会提醒你该文件不存在是否创建,如果是英文版应该是一连串的英文
你点 是Y 就是了
OK,现在头文件有了

双击Header Files
4.jpg
可以看到有我们的.c文件
双击我们创建的.c文件

它又提示一个文件不存在,要创建吗,继续点是

好的,现在可以在你的头文件中写函数了
没办法我太菜,写个ADD函数就好。。
5.jpg
写完就在主文件中#include ""下就好了

然后就可以直接调用了
6.jpg
好像没什么问题,就这样了
7.jpg





补充第二种方法:
在你的工作空间的目录下,新建一个文本文档
把文档重命名为 XXXX.c或者XXXX.h
然后通过以上方法添加也可以(这种方法不会提示文件不存在)

应该够详细了,如果再不行你可以加我小号帮你远程(大号不想再加人了)

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 15:58:58 | 显示全部楼层
以上两种方法都需要被保存的文件(*.lib,*.h)被放在适当目录,一般的编译器都有环境目录的选项,需要在Library Directry及Header Directry中设置一下。当然如果不进行设置也可以,那就需要将这些文件复制到工程所在目录了。
*****************************
比如有一个函数为
int function( int a)
{
  return a * a;
}

那么你可以把这个函数保存为 myFuc.c
放在 include 文件夹里。

然后在另外一个func.c
里可以这样调用:
#include<stdio.h>
#include“myFuc.c“

extern int function( int a);
main()
{
  printf(“result = %d\n“,function(10));
  getch();
}

结果为100

该程序在TC2.0编译通过。
自己编写的函数一般最好不要在.h头文件里定义,在头文件里声明的话是比较好的,函数的定义最好在.c文件里。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 17:04:34 | 显示全部楼层
1.写好自己的.c和.h文件
2.把.c和.h文件拷贝到你的工程目录下,你自己看看吧,该工程的其它文件在什么位置也把.c和.h文件拷贝到什么位置
3.选择  工程-》添加到工程-》文件
把你的.c和.h文件选中兵确定
4.没有了,如果还有,请你告诉我
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-7 17:05:15 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-2-7 15:49
首先回答你的问题
还有。。。VC系统中他的头文件又是怎么调用函数的
你指的是类似stdio.h这些编译器自带的 ...

额,原来不用声明函数直接Include进来就使用了。。。大哥。。你能把系统调用实现过程的流程实现下吗。。就演示下。。想学习学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-7 18:24:16 | 显示全部楼层
<assert.h> 定义宏assert()

<ctype.h>字符处理

<errno.h> 错误报告

<float.h> 定义与实现相关的浮点值勤

<limits.h> 定义与实现相关的各种极限值

<locale.h> 支持函数setlocale()

<math.h> 数学函数库使用的各种定义

<setjmp.h> 支持非局部跳转

<signal.h> 定义信号值

<stdarg.h> 支持可变长度的变元列表

<stddef.h> 定义常用常数

<stdio.h> 支持文件输入和输出

<stdlib.h> 其他各种声明

<string.h> 支持串函数

<time.h> 支持系统时间函数

<complex.h> 支持复数算法

<fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问

<inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数

<iso646.h> 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏

<stdbool.h> 支持布尔数据类型类型。定义宏bool,以便兼容于C++

<stdint.h> 定义标准的、可移植的整型类型集合。该文件包含在<inttypes.h>中

<tgmath.h> 定义一般类型的浮点宏

<wchar.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数

<wctype.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-7 20:00:33 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-2-7 18:11
系统调用流程?应该是这样吧。我不确定,不过这样应该可以实现

首先把源码和头文件编译成目标文件.o ...

额,好吧。。。复杂的程度比我想的还要多。。。那你就是最佳答案吧,解答得挺详细的,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-8 10:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表