Re: [問題] 該怎麼做才能正確的把標頭檔內的函式引 …
一個可以被多處引用的 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
推
11/14 22:44, , 1F
11/14 22:44, 1F
→
11/14 22:45, , 2F
11/14 22:45, 2F
→
11/14 22:45, , 3F
11/14 22:45, 3F
推
11/14 23:00, , 4F
11/14 23:00, 4F
推
11/14 23:06, , 5F
11/14 23:06, 5F
推
11/14 23:28, , 6F
11/14 23:28, 6F
→
11/15 01:44, , 7F
11/15 01:44, 7F
→
11/15 01:46, , 8F
11/15 01:46, 8F
→
11/15 01:50, , 9F
11/15 01:50, 9F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):