最近做了個小專案,按鍵+數碼管顯示+spi通訊,對於引數設定和通訊頗多感觸,這兩個看似簡單,做起來一點都不簡單,要是做的可靠全面更是不簡單,不管是工作量和對c的要求一點都不比控制的核心少和淺。現把做專案的過程中遇到的幾個問題摘出來,做個總結,也方便以後看。
1,永遠不要把外部函式和變數的宣告放到.c檔案中,而是要:
c原始檔要包涵自己的標頭檔案,目的就是讓編譯器檢查定義和宣告的一致性,如下
a.c
#include
int sum(int a,int b)
a.h
intsum(int a,int b);
這樣在a.c中包含自己的標頭檔案a.h,在a.c中的函式sum修改時,編譯器在編譯時就會檢查函式的定義和宣告是否一致性。在其他比如b.c原始檔中,如果要用到a.c中的sum函式時,在b.c的原始檔中包涵a.h即可。
2,最好不要在標頭檔案中定義變數
定義變數和宣告變數的區別在於定義會產生記憶體分配,是彙編階段的概念;而宣告則只是告訴包含該宣告的模組在鏈結階段從其他模組尋找外部函式和變數。
全域性變數如果在標頭檔案中定義,如下:
#ifndef _***x_h
#define _***x_h
int a;
……#endif
那麼,如果這個標頭檔案被引用的話,變數a會被重複定義,顯然語法上就錯了。只不過有了這個#ifndef的條件編譯,所以能保證你的標頭檔案只被引用一次,在編譯時會通過。不過若多個c檔案包含這個標頭檔案時,還是會出錯,因為巨集明的有效範圍僅限於本c原始檔,所以在多個c檔案編譯時是不會出錯的,但在鏈結時就是報錯,多出定義了同乙個變數。
3,關於switch語句中變數的定義
switch(i)
應該把變數定義`static char s_u8aa`放在switch前面。之所以在switch中最好不要定義變數,是因為這樣可以避免出現下面的情況:
case
1: int x;
case
2: x = 0;
4,位變數必須是全域性變數或static變數。
a.可以放在原始檔的開始bit g_bflag;
b.也可以放在原始檔的中間,比如函式中,但是static型別,比如static bit s_bflag
c.但不允許在函式內部這樣定義bit b_flag
,這違反了位變數必須是全域性變數或static變數的原則。
5,條件與&&
中,最好不要有函式,特別是需要執行到條件與&&
每次都要執行的函式,比如與程式的時鐘滴答ticktime
有關的函式。
u8flagdisposflash =u8flagdisposflash && ledstatechange();
其中,ledstatechange()與ticktimer有關,程式執行與預期不符。推測是,編譯器在編譯時,當u8flagdisposflash = 0
時不執行ledstatechange()
,導致執行效果和預期不符。修改如下:
char aa = 0;
aa = ledstatechange();
u8falgdisposflash = u8flagdisposflash && aa;
這樣修改,達到預期效果!
總結,永遠不要把外部函式和變數的宣告放到.c原始檔中,不要在標頭檔案中定義變數,標頭檔案只放宣告即可。swithc語句中不要定義變數,而要在其前面定義;bit位變數必須是全域性變數或static變數;條件與&&
中最好不要出現函式,因為可能不被執行。
1 9 標頭檔案
from 在程式中,cpp擴充套件的檔案並不是唯一一種常見的檔案。另一種檔案稱為標頭檔案,有時被稱為include file。都檔案基本都有乙個.h副檔名。標頭檔案的目的是將其它檔案要用到的宣告整合到一起。標準庫標頭檔案的使用 看一下下面的程式 include 2 int main 3 這個程式使用...
4412 標頭檔案作用
include 基礎標頭檔案,包括型別申明和printk include module init,init include module license include ioremap ioread32 iowrite32 include arch arm mach exynos include m...
(10)標頭檔案和注釋
標頭檔案 確保標頭檔案對此包含仍能安全工作的常用技術是預處理技術。它是c 從c語言繼承而來,預處理器是在編譯之前執行的一段程式,可以部分的改變我們所寫的程式,之前已經使用的一項預處理功能 include,當預處理器看到 includde標記時就會用指定標頭檔案的內容代替 include.c 程式還會...