為什麼 h檔案中只能申明不能定義全域性變數

2021-08-20 01:38:20 字數 753 閱讀 7571

最近使用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 新手,對申明和定義這兩個詞比較陌生,那麼我先解釋一下申明和定義的意思 原諒我廢話多 為什麼需要內聯函式?函式呼叫包含一系列工作,例如儲存暫存器,並在返回時恢復,可能需要拷貝實參,程式轉向乙個新的位置執行等,這些工作會...