c语言结构体头文件
Ⅰ c语言代码的头文件与源文件有什么区别
头文件和源文件在本质上没有任何区别。 只不过一般:后缀为 .h 的文件是头文件,内含函数声明、宏定义、结构体定义等内容。后缀为 .c 的文件是源文件,内含函数实现,变量定义等内容。而且是什么后缀也没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。这样分开写成两个文件是一个良好的编程风格。
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:
①预处理阶段
②词法与语法分析阶段
③ 编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各 个目标文件 (.obj文件)
④连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关 的可执行文件,当然,最后还可以用obj生成纯二进制码,也就是去掉了文件格 式信 息。(生成.exe文件)
3.比方说 在aaa.h里定义了一个函数的声明,然后在aaa.h的同一个目录下建立aaa.c , aaa.c里定义了这个函数的实现,然后是在main函数所在.c文件里#include这个aaa.h 然后我就可以使用这个函数了。 main在运行时就会找到这个定义了这个函数的aaa.c文件。这是因为:main函数为标准C/C++的程序入口,编译器会先找到该函数所在的文件。假定编译程序编译myproj.c(其中含main())时,发现它include了mylib.h(其中声明了函数void test()),那么此时编译器将按照事先设定的路径(Include路径列表及代码文件所在的路径)查找与之同名的实现文件(扩展名为.cpp或.c,此例中为mylib.c),如果找到该文件,并在其中找到该函数(此例中为void test())的实现代码,则继续编译;如果在指定目录找不到实现文件,或者在该文件及后续的各include文件中未找到实现代码,则返回一个编译错误.其实include的过程完全可以“看成”是一个文件拼接的过程,将声明和实现分别写在头文件及C文件中,或者将二者同时写在头文件中,理论上没有本质的区别。以上是所谓动态方式。对于静态方式,基本所有的C/C++编译器都支持一种链接方式被称为Static Link,即所谓静态链接。在这种方式下,我们所要做的,就是写出包含函数,类等等声明的头文件(a.h,b.h,...),以及他们对应的实现文件(a.cpp,b.cpp,...),编译程序会将其编译为静态的库文件(a.lib,b.lib,...)。在随后的代码重用过程中,我们只需要提供相应的头文件(.h)和相应的库文件(.lib),就可以使用过去的代码了。相对动态方式而言,静态方式的好处是实现代码的隐蔽性,即C++中提倡的“接口对外,实现代码不可见”。有利于库文件的转发.
Ⅱ C语言在头文件A里引用头文件B里定义的结构体类型,报错结构体未定义怎么解决
你要看看报的是什么错 是否是函数声明参数和函数实现的参数不一致 ECAN_MsgStruct在形参里已经可以正常识别,颜色已经变了,应该是其他地方错了,因为你没有发错误信息,无法帮你判断。
Ⅲ C语言两个.c文件能否通过两个头文件相连
没用这么麻烦,你只需要3个文件:
file1.c file2.c file2.h
将file2.c和file1.c都include file2.h,file2.c中的所有结构体都在file2.h中定义,函数虽然在.c中定义,但声明也就是extern在file2.h中,这样file1.c就能使用file2.c里的函数和结构体了。
Ⅳ 用C语言实现数据结构时需要哪些头文件
1、stdio.h,这个是用来输入输出。动态内存分配函数要用到的,所以要包含malloc.h,其他的还可能用到字符(串)处理函数(需包含string.h头文件)、数学函数(需包含math.h),包含什么头文件主要看i你想用这些数据结构实现什么功能,用到什么函数。
2、C语言常用头文件:
ALLOC.H 说明内存管理函数(分配、释放等)。
ASSERT.H 定义 assert调试宏。
BIOS.H 说明调用IBM—PC ROM BIOS子程序的各个函数。
CONIO.H 说明调用DOS控制台I/O子程序的各个函数。
CTYPE.H 包含有关字符分类及转换的名类信息(如 isalpha和toascii等)。
DIR.H 包含有关目录和路径的结构、宏定义和函数。
DOS.H 定义和说明MSDOS和8086调用的一些常量和函数。
ERRON.H 定义错误代码的助记符。
FCNTL.H 定义在与open库子程序连接时的符号常量。
FLOAT.H 包含有关浮点运算的一些参数和函数。
GRAPHICS.H 说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同驱动程序的各种颜色值,及函数用到的一些特殊结构。
IO.H 包含低级I/O子程序的结构和说明。
LIMIT.H 包含各环境参数、编译时间限制、数的范围等信息。
MATH.H 说明数学运算函数,还定了 HUGE VAL 宏, 说明了matherr和matherr子程序用到的特殊结构。
MEM.H 说明一些内存操作函数(其中大多数也在STRING.H中说明)。
PROCESS.H 说明进程管理的各个函数,spawn…和EXEC …函数的结构说明。
SETJMP.H 定义longjmp和setjmp函数用到的jmp buf类型,说明这两个函数。
SHARE.H 定义文件共享函数的参数。
SIGNAL.H 定义SIG[ZZ(Z] [ZZ)]IGN和SIG[ZZ(Z] [ZZ)]DFL常量,说明rajse和signal两个函数。
STDARG.H 定义读函数参数表的宏。(如vprintf,vscarf函数)。
STDDEF.H 定义一些公共数据类型和宏。
STDIO.H 定义Kernighan和Ritchie在Unix System V 中定义的标准和扩展的类型和宏。还定义标准I/O 预定义流:stdin,stdout和stderr,说明 I/O流子程序。
STDLIB.H 说明一些常用的子程序:转换子程序、搜索/ 排序子程序等。
STRING.H 说明一些串操作和内存操作函数。
SYS\STAT.H 定义在打开和创建文件时用到的一些符号常量。
SYS\TYPES.H 说明ftime函数和timeb结构。
SYS\TIME.H 定义时间的类型time[ZZ(Z] [ZZ)]t。
TIME.H 定义时间转换子程序asctime、localtime和gmtime的结构,ctime、 difftime、 gmtime、 localtime和stime用到的类型,并提供这些函数的原型。
VALUE.H 定义一些重要常量,包括依赖于机器硬件的和为与Unix System V相兼容而说明的一些常量,包括浮点和双精度值的范围。
Ⅳ C语言结构体
void (*ccc)()
是一个函数指针,它指向一个无参数无返回值的函数。
void(*)fff 这一行,在给出的代码里,看不出有什么作用,因为是宏定义,得看放在哪里使用才知道。
sss是结构体的别名,ddd是结构体sss的指针型别名,相当于 sss*。
例如,当你想定义一个结构体的时候,你会使用 sss mystruct;这种形式,如果想定义其指针,则一般会这样写,sss* pmystruct; 这里的ddd就是sss* 的别名,ddd pmystruct 等同于 sss* pmystruct。
v是函数ggg_fun的形参,是sss*(也就是ddd)类型的,是结构体指针,所以访问操作结构体内成员时刻使用->运算符进行。
总结
void (*ccc)()是结构体成员,一个函数指针。
sss 结构体别名
ddd 结构体指针别名
v 结构体指针型形参
Ⅵ C语言里time结构体和gettime()函数包含在哪个头文件里
二者均定义在time.h中。
1
在C语言中,为了操作简单,减少引入头文件的数量,相关功能的类型及函数均会定义在同一头文件中,比如输入输出相关的均定义在stdio.h中,而时间相关的均定义在time.h中。
2
time结构体,即struct
time,
是用来存储时间的结构体。
3
gettime函数,为获取时间函数,其参数为struct
time
*类型。
另外,在不确定是存储在哪个头文件,即编程时不确定要引用哪个头文件时,可以在系统头文件文件夹中,进行全文搜索,从而得知要需要的头文件,及对应的使用方式。
Ⅶ C语言头文件中定义结构体的问题
C语言程序设计中,为防止头文件在同一编译单元被重复引用,常引入#ifndef宏来进行保护,如:头文件my_head.h
#ifndef_MY_HEAD_H_//如果没有定义宏_MY_HEAD_H_
#define_MY_HEAD_H_//则,定义该宏名
//以下是被保护的代码区
//进行相应的全局变量和结构体类型定义
typedefstructstu{
inta;
intb;
}STU;
#endif//宏判断结束
这样,当整个代码中,多次引用这个my_head.h时,只有一次是生效的,系统编译时,如果检查宏_MY_HEAD_H_ 已经定义,就不会再进入被保护的代码区了。
PS: 宏名,一般是与头文件名相同,只是把字母全大写,前后加上下划线(_)
Ⅷ c语言中,结构体数据类型怎么定义到头文件中,然后用#include来引用感激不尽。
直接在头文件里面写typedef struct name{xxx};然后在要用的cpp里面include那个头文件,用name obj;来定义一个结构体变量obj
Ⅸ c语言中在头文件中初始化结构体的问题。
老大!数组是怎么初始化的?int x[]={1,2,3,4,...,2222222222}; !!!再看看你是怎么做的:
int x[]={1 2 3 4 5 ...},你这样行么?每个元素之间要用逗号分隔:
client[10]={
{"A0000","000000",0},
{"A1001","123456",0},
{"A1002","234561",0},
{"A1003","345612",0},
{"A1004","456123",0},
{"A1005","561234",0}
};
Ⅹ C语言里怎样建立头文件
你就所有函数去掉main后存起来,放在当前目录下就可以了以后要用就#include " *.h "就行了,用.c的也可哦 但如果你想和那编译器的头文件一样,就是上面那兄弟说的,不过要把你的函数都编译成*.obj 文件,用tlib.exe(我的是TC3)把它加到库函数中去, *.lib现在就可以#include "*.h"包含它了,如那个CS.lib就可以,因为我们一般是用用小型编译的就在命令行: tlib.exe cs.lib+*.obj (注意具体放在哪的路径写清楚,如:e:\..\..我省略而已)