Re: [問題] multiple definition in gcc?
※ 引述《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"的狂狷不馴;屬於年少的輕狂色彩 ◎
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章