標籤:style 使用 檔案 資料 問題 ar 代碼 amp
代碼編寫規範,命令列編譯,庫函數簡介,命名空間介紹,函數調用介紹,啞元函數介紹
一般來說,有.c實現檔案,應該都要有.h標頭檔,.c檔案中的所有函數都應該在.h檔案中聲明。
命令列編譯方法:
1、gcc 後面帶所有.c 檔案 -o 輸出檔案名 直接產生可執行檔
2、依次gcc -c .c檔案 -o ***.o 產生***.o檔案
然後 gcc 所有.o檔案 -o 輸出檔案 產生可執行檔
程式中的靜態全域變數不可以被其他檔案中的語句使用。
.c檔案使用.h檔案中的全域變數:extern 變數類型 變數名;
.h檔案應該用#ifdef……#define……#endif 包含,防止重複引用出問題
經驗:
結構體定義時,變數點位元組越大的應該聲明在最後面,減少空間浪費。
結構體中,student stu;student *pstu;
取變數地址可直接用&(pstu->member),&stu.member,調用可使用 pstu->member,stu.member
堆記憶體的使用:
malloc分配的地址,不分局部和全域,如果沒有被free,就能在其他地方使用。
calloc(sizeof(int),n);//分配 n個整數的空間
malloc(n*sizeof(int));//分配 n個整數的空間
排序庫函數:qsort() 標頭檔:stdlib.h
qsort 的函數原型是void __cdecl qsort (void *base,size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*))
參數1:數組名
參數2:元素個數
參數3:資料類型大小,如:sizeof(int)
參數:比較函數:
如:int comp(const void *a,const void *b)
{
return strcmp(*(const char **)a,*(const char **)b);
}
int comp(const void* a,const void* b)
{
return*(int*)a-*(int*)b;
}
庫函數使用:
atoi,atol,atoll,atof --字元轉換成數字 標頭檔:stdlib.h
char str[50]="123";int id=0;
sscantf(str,"%d",&id);//從字串讀到資訊放入變數中
sprintf(str,"hello %d",123);//把變數的值輸出到字串
fscanf(FILE*,"%d",&id);//從檔案輸入到變數
fprintf(FILE*,"%d",id);//變數輸出到檔案
命名空間聲明:
namespace ns1{
//代碼,函數
void fun1(){}
}
//預設命名空間函數
void fun1(){}
調用:
如果是預設的命名空間,可直接調用 fun1();或::fun1();調用
ns1中的函數 ,可用 ns1::fun1(); 調用
重載:
和函數名、參數列表有關,和返回值無關(同一範圍,參數不同,函數名相同才能構成重載)
重載解析:安全匹配>常量轉換>升級轉換>標準轉換>自訂轉換>省略符號匹配
不同命名空間的同名函數,在範圍內可見時,可構成重載,但不一定是重載。
查看 .o檔案中的模組:
nm ***.o
c++和c函數的區別:
c編譯器產生的函數名不變,c++編譯器產生的函數名會變化(c++換名原則),如果是C++調用c的函數,通過在 聲明函數前加 exterm "C" [函式宣告] ,可防止c++在調用時改名,c中不支援重載。
函數在定義時,可指定參數的預設值,或者在聲明時可帶預設參數。
啞無函數的定義:有參數類型,無參數變數,傳任何參數值對函數調用的結果無影響,只是為了重載。