最近使用keil編寫下位機微控制器程式,打算進行模組化的設計,遇到了在.h檔案中定義全域性變數報錯的問題。
原因:因為c語言的include是直接將檔案嵌入到include這個地方的.如果多次包含這個標頭檔案,就存在多次建立變數的問題。
解決辦法:
在標頭檔案中申明全域性變數,在對應的.c檔案中定義該全域性變數,其他檔案訪問時候就不會報錯了。
為此寫了一段測試**:
my.h
#ifndef __my_h__
#define __my_h__
extern void my_printf(char *s);
extern char ch;
#ifndef max
#define max 255
#endif // max
#endif
my.c
#include "my.h"
#include "stdio.h"
char ch='a';
void my_printf(char *s)
main.c
#include #include #include "my.h"
int main()
執行結果
C 為什麼模板只能在標頭檔案中實現?
模板類的定義和實現必須要在同乙個檔案中,通常是標頭檔案,編譯器要看到模板實現才能展開模板。因為初始化乙個模板,編譯器根據模板的引數建立乙個新的類。比如 templatestruct foo somewhere in a cpp foof 編譯器在解析到這段 時,會建立乙個新類,等價於 struct ...
Junit中為什麼不能啟動多執行緒
其實junit是將test作為引數傳遞給了testrunner的main函式。並通過main函式進行執行。test函式在main中執行。如果test執行結束,那麼main將會呼叫system.exit 0 即使還有其他的執行緒在執行,main也會呼叫system.exit 0 system.exit...
C 內聯函式為什麼定義在標頭檔案中?
最近從新撿起c 突然有乙個想法,為什麼內聯函式的會在標頭檔案中申明和定義。如果是c 新手,對申明和定義這兩個詞比較陌生,那麼我先解釋一下申明和定義的意思 原諒我廢話多 為什麼需要內聯函式?函式呼叫包含一系列工作,例如儲存暫存器,並在返回時恢復,可能需要拷貝實參,程式轉向乙個新的位置執行等,這些工作會...