[問題] extern應該宣告在副函式c中的h檔嗎?

看板C_and_CPP作者時間10年前 (2015/12/06 04:10), 10年前編輯推噓4(4012)
留言16則, 8人參與, 最新討論串1/1
我看misra-c規範中有提到 8.8 物件或函數若為外部,應只宣告在唯一檔案中 其舉例如下 1.於A.c程式碼中宣告物件或函數本體 void Function1(void) {….} int a; 2.再於A.h程式碼中宣告可被外部引用 extern void Function1(void); extern int a; 3.則於B.c、C.c…包含後就可直接引用 #include “A.h” 但對於第2個例子我有點疑惑, 在A.c中若有一個Function1通常會在A.h中宣告 void Function1(void) 這時因為要被外部引用宣告extern void Function1(void) 又被A.c自己include進來,不會有衝突? 同樣的c中已經宣告int a,又在會被include進來的h檔中寫extern int a 是否衝突啊 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.227.152.56 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1449346242.A.A2F.html ※ 編輯: qeagle (36.227.152.56), 12/06/2015 04:30:58

12/06 07:02, , 1F
不會
12/06 07:02, 1F

12/06 09:27, , 2F
不會,一個是宣告,一個是定義
12/06 09:27, 2F

12/06 11:47, , 3F
extern只是表示其他有地方存在int a 並不表示實際有空間
12/06 11:47, 3F

12/06 11:47, , 4F
開出來 所以寫了無所謂
12/06 11:47, 4F

12/06 12:22, , 5F
反過來, 沒有 extern 宣告的地方就是那個「其他地方」
12/06 12:22, 5F

12/06 12:22, , 6F
所以不只一起寫沒有問題, 你還必須剛好在一個地方寫上
12/06 12:22, 6F

12/06 12:58, , 7F
可是這樣不是會變成在某C檔宣告 int A
12/06 12:58, 7F

12/06 12:59, , 8F
又在其INCLUDE的h檔中再INCLUDE extern int a;不算重覆嗎?
12/06 12:59, 8F

12/06 13:00, , 9F
一直以為在同一個C中不能同時定義其為變數又宣告EXTERN
12/06 13:00, 9F

12/06 13:37, , 10F
extern是指宣告但不定義 與定義有沒有在同一個檔無關
12/06 13:37, 10F

12/06 14:12, , 11F
compiler time & linking time
12/06 14:12, 11F

12/06 14:47, , 12F
謝謝,可以這樣寫的話解決我放在副函式.C中的全域怎麼宣告
12/06 14:47, 12F

12/06 14:48, , 13F
的問題,一直以為這兩衝突,看來全域宣告在*.H給它檔用即可
12/06 14:48, 13F

12/06 15:42, , 14F
如果在 scope 內的確不能用 non-extern declaration follow
12/06 15:42, 14F

12/06 15:42, , 15F
extern declaration
12/06 15:42, 15F

12/06 15:43, , 16F
但是 global 就可以
12/06 15:43, 16F
文章代碼(AID): #1MOqJ2el (C_and_CPP)