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:\..\..我省略而已)