Re: [問題] multiple definition in gcc?

看板Programming作者時間18年前 (2007/07/08 21:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《rattler.bbs@bbs.ntu.edu.tw (好人可以裝酷嗎)》之銘言: > 貼個很簡單的例子來說明multiple definition的問題.. > 有三個檔案b.c, b.h 和 main.c, 執行gcc b.c main.c之後,產生如下的錯誤訊息 > /tmp/ccWtXLur.o(.data+0x0): multiple definition of `m' > /tmp/ccwfCTTj.o(.data+0x0): first defined here > 我以為說, 用#ifndef __B_H__等行, 可以確保b.h只會被include一次, > 但是似乎在main.c 以及b.c中的include "b.h", 皆執行了#include "b.h"此行, 太天真了, #include 的意思就是把檔案內容貼上去的意思, 也就是說在 main.c 跟 b.c 開頭都會 b.h 內的每一行, 編譯 main.c 和 b.c 時 __B_H__ 都是 undefined 的狀態, 理所當然 #ifndef __B_H__ 都會成立, 裡面的 int m = 4; 一定會被編譯到。 header guard 的用意不是你想的這樣, 它是在防止在同一個 .c 面重複 include 同一個 file 兩次, 通常是你又寫了 c.h 檔, 裡面又 #include "b.h", 所以當你同時 #include "b.h" 和 #include "c.h" 時, 會隱性的 #include "b.h" 兩次 (除非你打開 c.h 才看得出來), 這時使用 header guard 就能讓下面這兩行 #include "b.h" #include "c.h" 變成 #ifndef __B_H__ #define __B_H__ <------- 這裡 #define int m = 4; #endif #ifndef __B_H__ <------- 這裡發現已經 #define,跳過 #endif 之前的每一行 #define __B_H__ int m = 4; #endif /* * c.h 內的剩餘內容 */ /* * .c file 的檔案內容 */ > 因而造成multiple definition的問題. > 不知道問題是在哪呢? 該如何做呢? > 謝謝 > ================================== > b.h: > #ifndef __B_H__ > #define __B_H__ > int m = 4; > #endif > ---------------------- > b.c: > #include "b.h" > ---------------------- > main.c: > #include "b.h" > int main() { > return 0; > } -- Ling-hua Tseng (uranus@it.muds.net) Department of Computer Science, National Tsing-Hua University Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Software pipelining for VLIW architectures Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.252 > ╰─╮ ╚╦═╦╝ From:61-230-219-135.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩
文章代碼(AID): #16aETW00 (Programming)
文章代碼(AID): #16aETW00 (Programming)