定义自己的头文件(C语言)

本文介绍如何在Turbo C环境下创建自定义函数库,并通过实例演示了使用TLIB工具添加自定义函数的过程。同时,文章还详细解释了如何编写和使用自定义头文件,包括避免重复编译的技巧。

文章1

自定义函数库的方法及应用: 

一、2个相关的命令 

1、TCC——TC的DOS下的命令行编译连接工具 
2、TLIB——TC的DOS下的库操作工具 

二、1个自定义的函数库的例子 

1、 在TC集成环境下,编一个文件USERADD.C 
#define _NO_MAIN 
int add(int *a,int *b) 
{ int c; 
c=(*a)+(*b); 
return c; 

按ALT—F9编译 生成一个 USERADD.OBJ文件。 

2、按F10—F—O 退到DOSSHELL(DOS环境下) 
COPY USERADD.OBJ 到 ../LIB目录,在/LIB目录下执行 
TLIB USERLIB.LIB+USERADD.OBJ 就生成了一个自己的函数库 USERLIB,在这个函数库里就包含了函数模块 int add(int *a,int *b) 的二进制代码。现在已经将自定义的函数放进了函数库,就可以把原文件USERADD.C删掉不要了。(当然,为了以后维护方便,还是作一个备份为好)。 以后如有其它的函数模块,也可以编译后用TLIB 命令加入到这个函数库里。 

3、写一个包含文件 USER1.H,写完后COPY到INCLUDE 目录。内容如下: 
int add(int *,int *); 

4、作好了以上的自定义函数库的准备工作,现在就可以使用了。 
写一个程序,取名为ADD-1.C,在程序中调用库函数add( ); 
#include<stdio.h> 
#include<user1.h> 
void main( ) 

int a,b,c; 
a=20;b=30; 
c=add(&a,&b); 
printf(“%d”,c); 


5、在DOS命令行下,执行 TCC ADD-1.C ../LIB/USERLIB.LIB 就OK! 
运行ADD-1.EXE,可以看到输出结果 50 
============================================================= 

注:在DOS下编译和连接是一件烦心的事情,下面讲的方法就可以在TC集成环境下实现编译和连接。 
在上面的第二步中,TLIB命令的执行改为 TLIB CS. LIB+USERADD.OBJ 这里是将自定义函数模块的二进制代码加入到 运行时库CS. LIB里面。(对应不同的编译模式,选用不同的Cx.LIB) 
然后在集成环境下编译连接 ADD-1.C 就可以了。 

附注:CS.LIB 小模式库 
CC.LIB 紧凑模式库 
CM .LIB 中模式库 
CL .LIB 大模式库 
CH .LIB 巨模式库 
(以上五种为运行时库,无论建立何种程序都要连接这些函数库) 

EMU|FP87:EMU 是浮点数模拟函数库,而FP87则是当我们具有80X87共处理机时所使用的浮点数函数库。如果程序中有浮点运算就必须连接这二个函数库之一,以及MATHx函数库。 
MATHx:数学函数库。其中x代表s、c、m、l、h字符。 

另外,TC 的哪一个库函数的二进制代码放在哪一个函数库里不得而知。但有一点可以肯定,就在这其中的库里面。

 

 

文章2

一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库 函数时,要使用#include语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到#include处。为了避免因为重复引用而导致的编译错误,头文件常具有 
#ifndef   LABEL
#define   LABEL
   //代码部分
#endif
的格式。其中,LABEL为一个唯一的标号,命名规则跟变量的命名规则一样。常根据它所在的头文件名来命名,例如,如果头文件的文件名叫做hardware.h,
那么可以这样使用:
#ifndef   __HARDWARE_H__
#define   __HARDWARE_H__
  //代码部分
#endif
这样写的意思就是,如果没有定义__HARDWARE_H__,则定义__HARDWARE_H__,并编译下面的代码部分,直到遇到#endif。这样,当重复引用时,由于__HARDWARE_H__已经被定义,则下面的代码部分就不会被编译了,这样就避免了重复定义。
另外一个地方就是使用include时,使用引号与尖括号的意思是不一样的。使用引号(“”)时,首先搜索工程文件所在目录,然后再搜索编译器头文件所在目录。而使用尖括号(<>)时,刚好是相反的搜索顺序。假设我们有两个文件名一样的头文件hardware.h,但内容却是不一样的。一个保存在编译器指定的头文件目录下,我们把它叫做文件I;另一个则保存在当前工程的目录下,我们把它叫做文件II。如果我们使用的是#include <hardware.h>,则我们引用到的是文件I。如果我们使用的是#include “hardware.h”,则我们引用的将是文件II。笔者以前就遇到过一个同事问,为什么他修改了那个头文件里面的内容,好象跟没有修改一样?就是因为他有两个一样的头文件(就像我们刚描述的那样),他是使用#include<hardware.h>引用的,而他修改时,却是当前工程所在的目录下的那个文件
<think>首先,用户在询问C语言中u32类型对应的头文件。我需要基于提供的引用和之前的上下文来回答。 参考提供的引用: - 引用[1]:讨论了C语言头文件,包括stdio.h和#include指令。 - 引用[2]:提到了C语言的关键字,但没有直接提到u32。 - 引用[3]:谈论了U8, U16, U32在Python中的表示,但用户引用中提到“c语言u8u16 u32头文件”,意思是用户可能在问C语言中u32的头文件。 从引用[3]的文本:"c语言u8u16 u32头文件,U8,U16,U32在python中的表示。" 这表明用户可能混淆了C和Python,但核心问题是关于C语言中的u32类型。 在C语言中,标准的整数类型如int, char等是通过头文件如<stdint.h>或<inttypes.h>来定义固定宽度整数类型的,例如uint32_t,这通常对应于u32。 用户提到了“u32”,这通常是一个别名或宏定义,用于无符号32位整数。在C语言中,没有内置的u32类型;它是通过typedef定义的。常见的头文件包括: - <stdint.h>:定义了uint8_t, uint16_t, uint32_t, uint64_t等。 - 在一些嵌入式系统或特定库中,可能有自定义定义,比如在Linux内核中,u32被定义在<linux/types.h>中。 基于引用[3],它提到了Python中的表示,但用户问题是关于C语言的。所以,我需要专注于C语言。 用户上一次的问题或上下文:用户说“参考站内引用”,并提供了三个引用。然后问“我想查找C语言中u32类型对应的头文件”。 在系统指令中,我需要生成相关问题,并使用中文回答。 结构化我的回答: 1. **澄清问题**:解释什么是u32类型。 2. **提供答案**:指出对应的头文件。 3. **基于引用**:引用[3]提到u32,但它谈论Python,所以我需要纠正或扩展。 4. **完整回答**:确保回答真实可靠,使用系统指定的LaTeX格式。 关键点: - u32不是标准C类型;通常它是uint32_t的别名。 - 标准头文件是<stdint.h>。 - 在某些上下文中,如嵌入式系统,可能需要其他头文件。 从引用[3]:"c语言u8u16 u32头文件",这表明用户可能在寻找C语言定义u8, u16, u32的头文件。 在C语言中,这些通常通过<stdint.h>定义。 例如: - uint8_t for u8 - uint16_t for u16 - uint32_t for u32 所以,头文件是<stdint.h>。 在一些实现中,u32可能直接定义为uint32_t。 回答结构: - 介绍:在C语言中,u32类型不是内置类型;它通常是通过宏或typedef定义的无符号32位整数。 - 标准头文件:最常见的是<stdint.h>,其中定义了uint32_t。 - 其他可能的地方:在某些库或特定环境中,如Linux内核,可能在其他头文件定义。 - 使用示例:如何包含它。 添加LaTeX:由于是系统级指令,我需要使用行内数学表达式,比如提到类型时用$uint32_t$,但要注意格式。 系统指令说:所有行内数学表达式必须使用$...$格式,例如:$x^2$。 所以,在回答中,提到类型时可以用$uint32_t$。 独立公式:可能不需要,除非有复杂公式。 使用中文回答。 生成相关问题:在回答末尾添加相关问题。 引用标识:在引用的段落末尾添加引用标识,如[^1]。 用户提供了引用[1],[2],[3],所以我需要在回答中引用它们。 引用[1]:关于头文件的一般信息。 引用[2]:关键字列表。 引用[3]:关于u32在Python中。 最相关的是引用[3],因为它直接提到u32。 我将基于引用[3]来回答。 最终答案: - u32类型在C语言中通常定义在<stdint.h>头文件中。 相关问题: 1. 如何使用stdint.h定义的类型? 2. 嵌入式系统中u32的定义有何不同? 3. stdint.h中还有哪些其他类型? 确保回答清晰。 </think>### C语言中u32类型对应的头文件 在C语言中,`u32`类型(表示无符号32位整数)并不是语言的原始类型或关键字;它通常是通过宏定义或`typedef`创建的别名,用于表示固定宽度整数类型。根据您提供的引用和标准C语言实践,`u32`类型最常见的定义位于头文件`<stdint.h>`中。下面我将逐步解释原因和用法。 #### 1. **u32类型的基本概念** - `u32`是嵌入式系统或特定库中常见的简写,用于代表一个无符号的32位整数。在标准C中,等价的类型是`uint32_t`(定义在`<stdint.h>`中),它确保了整数始终占用32位。 - 这与引用[3]中提到有关U8、U16、U32的表示相对应:在C语言中,这些类型通常通过头文件定义为固定宽度类型,以确保跨平台一致性[^3]。引用[1]也强调头文件(如上所述)的作用是包含声明和宏定义,通过`#include`预处理指令被源文件共享[^1]。 #### 2. **对应的标准头文件** - **主要头文件:`<stdint.h>`** - 这个头文件是C99标准引入的,专门用于定义固定宽度整数类型。 - 包含`uint32_t`类型,`u32`通常作为其别名或宏定义(例如,在某些库中`#define u32 uint32_t`)。 - 用法示例: ```c #include <stdint.h> // 包含固定宽度整数类型的定义 int main() { uint32_t number = 42; // 标准写法 // 如果u32是别名,可以这样定义: typedef uint32_t u32; u32 var = 100; // 等同于uint32_t return 0; } ``` 在代码中,`uint32_t`确保变量占用4字节(32位),独立于平台架构。 - **其他可能头文件(非标准)** - 在某些特定环境(如嵌入式系统或Linux内核开发)中,`u32`可能定义在其他头文件中: - 例如,在Linux内核中,`u32`通常定义在`<linux/types.h>`中。 - 引用[2]提到C语言关键字(如`unsigned`、`int`)是基础,但固定宽度类型需要额外头文件支持[^2]。 - 检查您的开发环境:如果`<stdint.h>`不可用(如在旧版C编译器),开发人员可能自定义`u32`在项目头文件中。 #### 3. **为什么是 `<stdint.h>`?** - 标准性:`<stdint.h>`是ISO C标准的一部分,广泛支持跨平台开发。 - 实用性:它定义了多种类型,包括: - `uint8_t`(8位无符号整数,类似u8) - `uint16_t`(16位无符号整数,类似u16) - `uint32_t`(32位无符号整数,类似u32) - `uint64_t`(64位无符号整数) - 引用[3]讨论了U8、U16、U32在Python中的表示,但C语言需要通过头文件显式定义这些类型以确保内存布局一致性[^3]。引用[1]也强调`#include`指令的作用是将头文件内容插入当前源文件[^1]。 #### 4. **使用建议** - 包含头文件:在源文件顶部添加`#include <stdint.h>`。 - 类型安全:使用`uint32_t`代替`u32`以获得更好的可移植性;如果代码习惯使用`u32`,可以在项目中添加宏定义: ```c #include <stdint.h> typedef uint32_t u32; // 定义u32为uint32_t的别名 ``` - 编译支持:确保编译器支持C99或更高标准(编译时使用`-std=c99`选项,如`gcc -std=c99 file.c`)。 如果您有具体的开发环境(如嵌入式系统),请提供更多细节,我可以给出更针对性的建议。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值