[問題] include檔案

看板C_and_CPP (C/C++)作者 (wi)時間13年前 (2012/07/12 15:20), 編輯推噓10(10082)
留言92則, 10人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) gcc 問題(Question): 在程式中會有大量自訂參數都分散在不同的cpp檔案內 希望能夠在main.cpp只include一次,其他檔案都能使用到 錯誤結果(Wrong Output): D:\Dropbox\C++\aa\aa.cpp|7|error: 'aaaa' was not declared in this scope| 程式碼(Code):(請善用置底文網頁, 記得排版) //main.cpp #include "abc.h" #include "aa.h" int main() { aa(); return 0; } //aa.cpp #include <iostream> #include "aa.h" void aa(void) { std::cout<<aaaa<<std::endl; } //aa.h #ifndef AA_H_INCLUDED #define AA_H_INCLUDED void aa(void); #endif // AA_H_INCLUDED //abc.h #ifndef ABC_H_INCLUDED #define ABC_H_INCLUDED const int aaaa=10; #endif // ABC_H_INCLUDED 補充說明(Supplement): abc.h為定義參數用 aa.h/cpp為實際程式 我目前的想法是將參數定義在abc.h內,只需要在main內include一次就好 就不用在個別的cpp內再次include,而且都能正確讀到檔案 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.125.20.92

07/12 15:25, , 1F
這種設計模式.. 真妙.
07/12 15:25, 1F

07/12 15:25, , 2F
痾...請問應該怎樣會比較好?
07/12 15:25, 2F

07/12 15:26, , 3F
會想要包在一起主要是因為到處分散的話感覺改起來
07/12 15:26, 3F

07/12 15:26, , 4F
會很麻煩= ="
07/12 15:26, 4F

07/12 15:27, , 5F
我猜,你的 int aaaa, 實際上可以當作其它函式之輸入參數,
07/12 15:27, 5F

07/12 15:27, , 6F
因為一個cpp可能只會用到兩三個參數,但有好幾個cpp
07/12 15:27, 6F

07/12 15:27, , 7F
若是這樣的話我寧可多打些字,param 多幾個。
07/12 15:27, 7F

07/12 15:27, , 8F
那個參數是在一開始調整的時候會修改,調整好就固定
07/12 15:27, 8F

07/12 15:28, , 9F
調整好之後就不會在修改了,所以就用const把他固定
07/12 15:28, 9F

07/12 15:29, , 10F
話說,我對於include還是不甚了解,每次都缺什麼
07/12 15:29, 10F

07/12 15:29, , 11F
就include什麼,造成不同的cpp可能有重複include
07/12 15:29, 11F

07/12 15:32, , 12F
另外那些參數不是傳入參數,只是單純是function內
07/12 15:32, 12F

07/12 15:33, , 13F
所會用到的值
07/12 15:33, 13F

07/12 15:36, , 14F
個人是認為 func 內會用到就可以拿來當param,但爭辯先到這
07/12 15:36, 14F

07/12 15:36, , 15F
所以 const int aaa, 是一開始就確定的「常數」嗎 ?
07/12 15:36, 15F

07/12 15:37, , 16F
沒錯
07/12 15:37, 16F

07/12 15:38, , 17F
因為那個參數別的func也不會知道,是某個func獨有的
07/12 15:38, 17F

07/12 15:38, , 18F
可以想像程式定義好的常數,只是為了修改方便才用
07/12 15:38, 18F

07/12 15:38, , 19F
呈const參數
07/12 15:38, 19F

07/12 15:55, , 20F
sorry,現在才看到你只是要改善..基本上還是要 include ,
07/12 15:55, 20F

07/12 15:56, , 21F
沒辦法在 main.cpp 引入 **.h 後,其他檔案都看得到.
07/12 15:56, 21F

07/12 15:56, , 22F
所以就只能每個都include一次嗎?
07/12 15:56, 22F

07/12 15:57, , 23F
話說include的意思不是就把整段貼進去程式內?
07/12 15:57, 23F

07/12 15:57, , 24F
是的。即使你用 M_PI 這東西, 還是要到處 cmath 不是嗎 ?
07/12 15:57, 24F

07/12 15:58, , 25F
我這樣想說在cpp前先inlcude .h好像合理
07/12 15:58, 25F

07/12 15:58, , 26F
還是說include的觀念並不是這樣呢?
07/12 15:58, 26F

07/12 16:01, , 27F
是這樣沒錯,但**.h 有 header gard. 要達到你的要求就把
07/12 16:01, 27F

07/12 16:01, , 28F
gard. 拿掉, 但日後維護反而糟, 危險。
07/12 16:01, 28F

07/12 16:02, , 29F
看來我需要好好研究一下include到底是怎樣子
07/12 16:02, 29F

07/12 16:03, , 30F
所以目前比較好的方式就是每個用到的cpp就include?
07/12 16:03, 30F

07/12 16:04, , 31F
是的。其實你可以不用太在意include貼上後重新compile會慢
07/12 16:04, 31F

07/12 16:05, , 32F
即使對整份專案重編,IDE還是會去看每個.h/.cpp有沒有更動,
07/12 16:05, 32F

07/12 16:06, , 33F
有更動的話才重新生成.o,沒更動的話它是不會再動之前生成
07/12 16:06, 33F

07/12 16:06, , 34F
的目的檔,所以真正費時只有第一次編譯,和re-build.
07/12 16:06, 34F

07/12 16:10, , 35F
這個道理知道,只是原本想說如果能一個地方include就
07/12 16:10, 35F

07/12 16:10, , 36F
可以的話,這樣在之後修改應該會比較清楚
07/12 16:10, 36F

07/12 16:11, , 37F
照這樣的話,目前應該就是用到就include
07/12 16:11, 37F

07/12 16:11, , 38F
感謝你了~
07/12 16:11, 38F

07/12 17:10, , 39F
#include 簡單來說只是複製貼上而已
07/12 17:10, 39F

07/12 17:11, , 40F
你這樣做的話,會變成在global 宣告多個aaaa的變數 會錯
07/12 17:11, 40F

07/12 17:19, , 41F
我改成在main跟aa.cpp都include abc.h能正常編譯
07/12 17:19, 41F
※ 編輯: diabloevagto 來自: 140.125.20.92 (07/12 17:22)

07/12 17:24, , 42F
如果你每個要用的地方都宣告的話,就會了 Orz
07/12 17:24, 42F

07/12 17:26, , 43F
但我有用gard包起來@@這樣還會?
07/12 17:26, 43F

07/12 17:26, , 44F
抱歉...我對於分多個cpp/h檔案還需要多了解Orz
07/12 17:26, 44F

07/12 17:31, , 45F
應該是不了解#include 他簡單來說,就真的是複製貼上
07/12 17:31, 45F

07/12 17:31, , 46F
等於你在兩個檔案的global 的地方都有一個aaaa的變數
07/12 17:31, 46F

07/12 17:32, , 47F
要解覺得這問題,其實用macro 會好很多
07/12 17:32, 47F

07/12 17:33, , 48F
在abc.h 中的 const int aaaa = 10 改成#define AAAA 10
07/12 17:33, 48F

07/12 17:34, , 49F
然後在所有要用到aaaa的地方直接改成AAAA
07/12 17:34, 49F

07/12 17:34, , 50F
不過這個你想要的只include 一次就可以在所有檔案用的需求
07/12 17:34, 50F

07/12 17:34, , 51F
@h大,即使用macro,還是要一直 include **.h 吧 ?
07/12 17:34, 51F

07/12 17:35, , 52F
就不符合
07/12 17:35, 52F

07/12 17:35, , 53F
用這樣子的話,我一樣是要在每個地方都iclude abc.h
07/12 17:35, 53F

07/12 17:35, , 54F
07/12 17:35, 54F

07/12 17:37, , 55F
07/12 17:37, 55F

07/12 17:37, , 56F
嗯Orz
07/12 17:37, 56F

07/12 17:39, , 57F
為什麼你想要只include 在main 其它地方就可以用?
07/12 17:39, 57F

07/12 17:40, , 58F
編譯的時候每一個 .c 檔都是獨立的,所以要各自加
07/12 17:40, 58F

07/12 17:40, , 59F
照理來說,每個檔案都是獨立的程式 可以搭配不同的main
07/12 17:40, 59F

07/12 17:42, , 60F
你這樣的感覺,好像那麼多檔案,都是需要一個特定的main
07/12 17:42, 60F

07/12 17:42, , 61F
那...幹嘛分檔案?
07/12 17:42, 61F

07/12 17:43, , 62F
所以可以麻煩你說明一下你的需求是?
07/12 17:43, 62F

07/12 17:44, , 63F
他的需求只是貪懶,一份const能給所有檔案看到,又不想固定
07/12 17:44, 63F

07/12 17:45, , 64F
include 某個 header,問有沒有方式可滿足貪懶的需求。
07/12 17:45, 64F

07/12 17:46, , 65F
那,gcc compile 時 宣告特定macro 這樣可以嗎?
07/12 17:46, 65F

07/12 17:48, , 66F
我想到的也是從compiler的參數去著手
07/12 17:48, 66F

07/12 17:48, , 67F
對gcc參數沒研究...我都依賴IDE= =
07/12 17:48, 67F

07/12 17:49, , 68F
對唷,可以執編譯,連結期時動手腳. d 大用的是哪款 IDE ?
07/12 17:49, 68F

07/12 17:53, , 69F
剛剛查了一下,gcc可以用-Dmacro[=defn]來設定
07/12 17:53, 69F

07/12 18:15, , 70F
我覺得const比macro好 :~
07/12 18:15, 70F

07/12 18:44, , 71F
你不做任何include 命名空間就多了一堆變數
07/12 18:44, 71F

07/12 18:45, , 72F
不覺得哪裡不太蘇湖嗎?
07/12 18:45, 72F

07/12 20:18, , 73F
我也試過這種include 編譯不會錯 (常數不就直接define?
07/12 20:18, 73F

07/12 20:21, , 74F
挖我漏看了一頁... 當我沒回吧XD
07/12 20:21, 74F
不好意思,我沒有講清楚需求。 我目前有一個project,用到滿多個class。 我將每一個class都分成.h跟.cpp。 因為是寫影像處理方面的程式所以有不少門檻值要做設定, 並且都是要隨著環境調整,但只有在環境改變得時候才要修改。 第一次修改好後,以後就都不用再修改。 每個class多少都有一兩個參數要做設定,假如我都寫在cpp內這樣要設定的時候 就要到好幾個檔案內修改,這樣很麻煩。 所以我就想說把那些參數拉出來另外一個.h檔內,但這有一個情況是在每個要用到的 .cpp內都要在include定義參數的.h檔一次,這樣挺麻煩的。 想說能不能做到懶人方法,就是在一開始的main檔內include一次就好,讓其他的 class都能夠看到那些參數。 不知道這樣解是有沒有比較清楚,麻煩大家了。 ※ 編輯: diabloevagto 來自: 140.125.20.92 (07/12 20:52)

07/12 21:19, , 75F
每個.cpp多加一行include → 這件事很簡單
07/12 21:19, 75F

07/12 21:19, , 76F
正常的 programmer 都應該能在三分鐘內搞定這件事
07/12 21:19, 76F

07/12 21:21, , 77F
還有另一個方法是設定IDE強制每個檔案都額外include
07/12 21:21, 77F

07/12 21:21, , 78F
不建議這個方法就是了
07/12 21:21, 78F

07/12 21:27, , 79F
了解!看來目前應該就是每個cpp都include一次
07/12 21:27, 79F

07/13 01:05, , 80F
數字不會變的話我覺得用巨集就好了
07/13 01:05, 80F

07/13 01:07, , 81F
const, macro 的戰爭基本上沒太大意義。
07/13 01:07, 81F

07/13 01:10, , 82F
樓上,我沒有要戰啦,只是看完本文後的直覺想法
07/13 01:10, 82F

07/13 01:11, , 83F
我承認我沒看到推文已經講過了 囧
07/13 01:11, 83F

07/13 01:37, , 84F
extern
07/13 01:37, 84F

07/13 01:39, , 85F
原來是想不用 include 的方法... include 說明了相依
07/13 01:39, 85F

07/13 01:42, , 86F
性, 不 include 就能用那等於把相依性藏起來了, 你乾
07/13 01:42, 86F

07/13 01:42, , 87F
脆實作全寫在 header 裡
07/13 01:42, 87F

07/13 08:12, , 88F

07/13 08:13, , 89F
多一個 param.c 專門放參數的實體
07/13 08:13, 89F

07/13 08:14, , 90F
各個 cpp 要用的時候用 extern 的方式去 link
07/13 08:14, 90F

07/13 09:07, , 91F
不過那行 extern 還是要每個檔案都加上去...XDDD
07/13 09:07, 91F

07/13 14:45, , 92F
看來我應該在每個cpp都include,這樣比較能表示相依
07/13 14:45, 92F
文章代碼(AID): #1F_dh5L5 (C_and_CPP)
文章代碼(AID): #1F_dh5L5 (C_and_CPP)