[爆卦]#Include是什麼?優點缺點精華區懶人包

為什麼這篇#Include鄉民發文收入到精華區:因為在#Include這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者StubbornLin (Victor)看板C_and_CPP標題Re: [問題] #inclu...


要搞清楚會不會重覆定義 先要搞清楚preprocessor是怎樣運作的
其實include你可以把它想成把整個檔案抓來擺在include的位置
舉個例子

--- foo.h ---
void foo();

--- bar.h ---
void bar();

--- util.h ---
#include "foo.h"

void doSomething();

--- main.cpp ---

#include "foo.h"
#include "bar.h"
#include "util.h"

....

首先先看util會被怎樣展,它會變成這樣

void foo();

void doSomething();

這個main.cpp會被展開成什麼樣子呢? 應該會像這樣

void foo();
void bar();
void foo();

void doSomething();

foo因為重覆出現 所以會有重覆定義的問題
其實原則很簡單,你只要想像#include那行會被整個檔案的內容取代就是了
preprocessor應該也是這樣做 有沒有什麼其它細節我就不太清楚
#ifndef和#define的目的就是在避免重覆定義
我們要解決重覆定義的問題 只要把上面的foo.util改成

#ifndef FOO_H
#define FOO_H
void foo();
#endif

如此一來main.cpp會被展開成

#ifndef FOO_H
#define FOO_H
void foo();
#endif

void bar();

#ifndef FOO_H
#define FOO_H
void foo();
#endif

void doSomething();

因為FOO_H在前面被define了,所以preprocessor在後面的foo就會把它忽略掉
這樣就不怕直接或間接的include到同一個header了

--
哇咧咧 創意投票系統 http://walele.com
易記學 程式設計教學 http://ez2learn.com/
易記學 程式設計討論區 http://forum.ez2learn.com
VICTOR's 個人Blog http://blog.ez2learn.com/
財報分析王 http://victorlin.serveftp.org/stock/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.113.155.49
tsaiminghan:謝謝, 請教一下通常會把什麼東西放到.H檔內? 02/12 22:56
tsaiminghan:除了原型宣告&共用的定義之外 02/12 22:58
plover:WTL全部寫在header files (  ̄ c ̄)y▂ξ 02/12 23:04

你可能也想看看

搜尋相關網站