1.使用extern時要嚴格對應宣告的格式,定義的是陣列型別,extern char a;而不能是extern char *a;
2.如果要在*.c檔案中引用另乙個檔案中的乙個全域性變數,那就應該放在*.h中用extern來宣告這個全域性變數。
3.函式宣告和定義前面extern沒有實際的意義(除非不想在對應標頭檔案宣告——
4.根據編譯器不同,有些編譯器可以鏈結(extern)常量:const float pi = 3.14; extern const flaot pi;
5.extern 可以鏈結外部變數,當我們兩個檔案同時引用同乙個全域性變數的時候,只在乙個檔案定義,編譯時會在未定義的檔案報錯;在兩個檔案都定義,編譯通過,鏈結時會包定義衝突的錯誤,解決辦法就是其中乙個檔案定義,另乙個檔案extern來告訴編譯器這個變數在其他檔案定義過了,自個兒去找(^..^)。當然也可以通過標頭檔案的方式來實現,變數定義在標頭檔案,連個引用變數的.c檔案均include有該標頭檔案。
6.extern "c",在c++的環境,想要相容c,一般都是需要extern "c"。格式:
#ifdef __cplusplus
#if __cplusplus
extern "c"
#endif
#endif /* __cplusplus */
原因是雖說c++相容c,但是由於c++具有物件導向的特性,所以假設沒有加上extern "c",而c++語法支援函式過載的原因,c++編譯器函式編譯後會有類似_foo_int_float_..這樣帶有變數引數之類的名字(函式過載實現的原理),而c的編譯器則會生成_foo這樣的名稱,所以在鏈結函式引用的時候會報錯(編譯後生成的名稱都不一樣如何引用c模組的函式).
參考:
vue語法使用注意事項
stop 就是js中的event.stoppropagation 的縮寫,它是用來阻止冒泡的 prevent 就是js中event.preventdefault 的縮寫,它是用來阻止預設行為的 capture 捕獲事件和冒泡事件 預設 是兩種事件流,事件捕獲是從document到觸發事件的那個元素 ...
verilog 語法注意事項
1.變數賦值或比較需要等位寬,進行嚴格約束,如 reg 7 0 param initial param 8 h87 最好不要寫 param 135 2.verilog 中使用case if else 或其他邏輯語句時需要保證語句的完整性,如 if 後需要跟隨 else case 內需要包含defau...
AudioRecord 使用小結與注意事項
使用專門的執行緒讀取資料,容易出現buffer overflow。使用 setrecordpositionupdatelistener時,要注意兩個問題 一 1.啟動錄音後,要先read buffer,才會通知啟用 listener。audiorecord startrecording audior...