作者 主題: 把程式拆成多個檔案  (閱讀 6161 次)

0 會員 與 1 訪客 正在閱讀本文。

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
把程式拆成多個檔案
« 於: 2007-03-11 21:38 »
我用 ifndef 去防止重複宣告
假設: main_a.c , main_b.c ,  abc.h , 123.h 四個檔

http://homepage20.seed.net.tw/web@1/shihyu/ifndef.rar
下面兩種的程式碼 , dev-c++ or gcc 都可用 ... 兩個差異只有
main_b.c 有加上 跟 沒有加上 #include "abc.h" 的差別


下面abc.h 確實防止123.h 再宣告 const int a =100;

代碼: [選擇]

-------------------------------------------------------------------------
// main_a.c
#include <stdio.h>
#include "abc.h"
#include "123.h"
int main()
{
      test();
     
}  

--------------------------------------------------------------------------
//main_b.c

void test()
{


}

--------------------------------------------------------------------------
//abc.h

#ifndef _ABC_H_
#define _ABC_H_
const int a = 100;
#endif

----------------------------------------------------------------------------
//123.h

#include  "abc.h"




不過我修改了一下main_b.c , 加上#include "abc.h" or  #include "123.h"
comiler 都會產生multiple definition of `a' 錯誤訊息
我想知道為何 ifndef 沒辦法解決 , 而造成編譯器出現這錯誤訊息
但為何在main_b.c 再加上 #include "abc.h", ifndef 不行防止?

代碼: [選擇]

-------------------------------------------------------------------------
// main_a.c
#include <stdio.h>
#include "abc.h"
#include "123.h"
int main()
{
      test();
     
}  

--------------------------------------------------------------------------
//main_b.c
#include "abc.h" // 加上這
void test()
{


}

--------------------------------------------------------------------------
//abc.h

#ifndef _ABC_H_
#define _ABC_H_
const int a = 100;
#endif

----------------------------------------------------------------------------
//123.h

#include  "abc.h"


謝謝

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
把程式拆成多個檔案
« 回覆 #1 於: 2007-03-11 21:56 »
第一個方法:main_b.c再加#include "123.h"

第二個方法:再開一個456.h裡面#include "123.h" 及#include "abc.h"
然後兩個.c都只#include "456.h"

兩個方法試試看吧^^!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
把程式拆成多個檔案
« 回覆 #2 於: 2007-03-11 22:02 »
stlee 你說的兩個方法我都試過不行 , 方式二 123.h, abc.h 包在456.h
只放 main_a.h 編譯OK~~
不過mina_b.h 如果也放456.h 就有問題 ..

我是在想這跟編譯器不同處理會不會也有差異 ..我只試過dev-c++ & gcc..
vc & bcb 沒有
感覺上使用ifndef 應該可以預防上面的問題但編譯器還是會出現錯誤 ..

謝謝

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
把程式拆成多個檔案
« 回覆 #3 於: 2007-03-11 22:06 »
剛剛測試用dev-c++ 改成C++ 測試我上面的程式就可以~~那應該是C 的問題..

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
把程式拆成多個檔案
« 回覆 #4 於: 2007-03-11 22:24 »
改成這樣...

代碼: [選擇]
#if ABC_H_
#define _ABC_H_
const int a = 100;
#endif

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
把程式拆成多個檔案
« 回覆 #5 於: 2007-03-11 22:47 »
yamaka 你好:

改這樣確實可以編譯過  , 不過可否告知一下為何 使用 ifndef 時 main_b.c 就無法編譯過出現 multiple definition of `a' ? 這樣似乎 ifndef 沒任何作用?

#if ABC_H_
#define _ABC_H_
const int a = 100;
#endif

這樣就無法作法應該不能定義 const int a = 100; //_ABC_H_ 沒有被定義過所以在加到 mian_b.c 還是不會有問題對嗎??

換成在main_a.c
#define _ABC_H_ 100
#include "abc.h"
#include "123.h"

這樣還是不可以 , 不過在C++ 就可以編譯過 ...@@  
   
謝謝

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
把程式拆成多個檔案
« 回覆 #6 於: 2007-03-11 23:44 »
既然 a 是 const, 何不這樣...

代碼: [選擇]
#ifndef _ABC_H_
#define  a      100
#define _ABC_H_
#endif

shihyu

  • 活潑的大學生
  • ***
  • 文章數: 223
    • 檢視個人資料
把程式拆成多個檔案
« 回覆 #7 於: 2007-03-12 00:03 »
yamaka 你好:

其實我主要是想知道為何 ifndef 照我上面程式碼在C 無法編譯過  , 而C++ 可以通過編譯.

我只是拿 const int a = 100; 測試 ifndef 用 , 主要我還是想知道為何 ifndef 不能防止再 main_b.c  加上 #include "abc.h" 或是 #include "123.h" 而照成編譯上錯誤 ?

謝謝