作者qrtt1 (null)
看板C_and_CPP
標題Re: [問題] 該怎麼做才能正確的把標頭檔內的函式引 …
時間Sun Nov 14 22:16:05 2010
一個可以被多處引用的 Header 要能避免自己被重複載入
也只有變數、函式的宣告,這能透過前置處理置來搞定。
============================================================== main.c
#include "featureA.h"
int main()
{
showFeatureA();
return 0;
}
在 main.c 內,引用了一個 header。
它們的寫法跟您寫的差別只是多了前置處理器,
並且將實作與宣告分離在 .c 與 .h
============================================================== featureA.h
#ifndef __FEATURE_A_H
#define __FEATURE_A_H
int featureA;
void showFeatureA();
#endif
============================================================== featureA.c
#include "featureA.h"
#include <stdio.h>
void showFeatureA()
{
printf("featureA %d\n", featureA);
}
==========================================================================
在 feature.h 內,透過檢查是不是 __FEATURE_A_H 是否被定義過,
來決定是不是會有 featureA.h 的內容。
我們知道,compiler 在前處理的時候,會展開前置處理器的定義。
把 #include 的內容,合併至引用的檔案內。
所以,當第一次被 #include 時,會包含 featureA.h 本身的內容。
第二次被 #include 時,就會是空的(因為 __FEATURE_A_H 已定義)
透過這樣的寫作慣例,我們盡情地引用 header 而不會產生錯誤。
另一種產生錯誤的情況是,一個變數被重複定義。
這通常會發生在 header 第二次被引用時,
常是忘了在 header 內只寫宣告的原則。
若我們將 featureA.h 內的
int featureA;
改寫成
int featureA = 0;
您就會得到這樣的錯誤:
gcc main.c featureA.o
featureA.o:(.bss+0x0):
multiple definition of `featureA'
/tmp/ccIWzIWE.o:(.bss+0x0): first defined here
collect2: ld 回傳 1
make: *** [all] Error 1
只要善用前置處理器以及不在 header 內定義變數、函式,
就能與 header 合平共存。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.231.52.57
推 loveflames:int featureA是定義,不過放在header不會出現重覆定義 11/14 22:44
→ loveflames:的錯誤,除非給它初值 11/14 22:45
→ loveflames:忘了說C語言限定 11/14 22:45
推 purpose:就 header 內寫 extern int featureA; 11/14 23:00
推 loveflames:只有C++才要加extern吧 11/14 23:06
推 purpose:覺得加了比較保險 11/14 23:28
→ manlike:一定要加extern吧 除非你這個.h只會被一個檔案include = = 11/15 01:44
→ manlike:不對 沒看仔細 = =" 11/15 01:46
→ manlike:像這種global變數通常會宣告定義在.c內 .h宣告extern = = 11/15 01:50