看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
EdisonX:這種設計模式.. 真妙. 07/12 15:25
diabloevagto:痾...請問應該怎樣會比較好? 07/12 15:25
diabloevagto:會想要包在一起主要是因為到處分散的話感覺改起來 07/12 15:26
diabloevagto:會很麻煩= =" 07/12 15:26
EdisonX:我猜,你的 int aaaa, 實際上可以當作其它函式之輸入參數, 07/12 15:27
diabloevagto:因為一個cpp可能只會用到兩三個參數,但有好幾個cpp 07/12 15:27
EdisonX:若是這樣的話我寧可多打些字,param 多幾個。 07/12 15:27
diabloevagto:那個參數是在一開始調整的時候會修改,調整好就固定 07/12 15:27
diabloevagto:調整好之後就不會在修改了,所以就用const把他固定 07/12 15:28
diabloevagto:話說,我對於include還是不甚了解,每次都缺什麼 07/12 15:29
diabloevagto:就include什麼,造成不同的cpp可能有重複include 07/12 15:29
diabloevagto:另外那些參數不是傳入參數,只是單純是function內 07/12 15:32
diabloevagto:所會用到的值 07/12 15:33
EdisonX:個人是認為 func 內會用到就可以拿來當param,但爭辯先到這 07/12 15:36
EdisonX:所以 const int aaa, 是一開始就確定的「常數」嗎 ? 07/12 15:36
diabloevagto:沒錯 07/12 15:37
diabloevagto:因為那個參數別的func也不會知道,是某個func獨有的 07/12 15:38
diabloevagto:可以想像程式定義好的常數,只是為了修改方便才用 07/12 15:38
diabloevagto:呈const參數 07/12 15:38
EdisonX:sorry,現在才看到你只是要改善..基本上還是要 include , 07/12 15:55
EdisonX:沒辦法在 main.cpp 引入 **.h 後,其他檔案都看得到. 07/12 15:56
diabloevagto:所以就只能每個都include一次嗎? 07/12 15:56
diabloevagto:話說include的意思不是就把整段貼進去程式內? 07/12 15:57
EdisonX:是的。即使你用 M_PI 這東西, 還是要到處 cmath 不是嗎 ? 07/12 15:57
diabloevagto:我這樣想說在cpp前先inlcude .h好像合理 07/12 15:58
diabloevagto:還是說include的觀念並不是這樣呢? 07/12 15:58
EdisonX:是這樣沒錯,但**.h 有 header gard. 要達到你的要求就把 07/12 16:01
EdisonX:gard. 拿掉, 但日後維護反而糟, 危險。 07/12 16:01
diabloevagto:看來我需要好好研究一下include到底是怎樣子 07/12 16:02
diabloevagto:所以目前比較好的方式就是每個用到的cpp就include? 07/12 16:03
EdisonX:是的。其實你可以不用太在意include貼上後重新compile會慢 07/12 16:04
EdisonX:即使對整份專案重編,IDE還是會去看每個.h/.cpp有沒有更動, 07/12 16:05
EdisonX:有更動的話才重新生成.o,沒更動的話它是不會再動之前生成 07/12 16:06
EdisonX:的目的檔,所以真正費時只有第一次編譯,和re-build. 07/12 16:06
diabloevagto:這個道理知道,只是原本想說如果能一個地方include就 07/12 16:10
diabloevagto:可以的話,這樣在之後修改應該會比較清楚 07/12 16:10
diabloevagto:照這樣的話,目前應該就是用到就include 07/12 16:11
diabloevagto:感謝你了~ 07/12 16:11
hakman:#include 簡單來說只是複製貼上而已 07/12 17:10
hakman:你這樣做的話,會變成在global 宣告多個aaaa的變數 會錯 07/12 17:11
diabloevagto:我改成在main跟aa.cpp都include abc.h能正常編譯 07/12 17:19
※ 編輯: diabloevagto 來自: 140.125.20.92 (07/12 17:22)
hakman:如果你每個要用的地方都宣告的話,就會了 Orz 07/12 17:24
diabloevagto:但我有用gard包起來@@這樣還會? 07/12 17:26
diabloevagto:抱歉...我對於分多個cpp/h檔案還需要多了解Orz 07/12 17:26
hakman:應該是不了解#include 他簡單來說,就真的是複製貼上 07/12 17:31
hakman:等於你在兩個檔案的global 的地方都有一個aaaa的變數 07/12 17:31
hakman:要解覺得這問題,其實用macro 會好很多 07/12 17:32
hakman:在abc.h 中的 const int aaaa = 10 改成#define AAAA 10 07/12 17:33
hakman:然後在所有要用到aaaa的地方直接改成AAAA 07/12 17:34
hakman:不過這個你想要的只include 一次就可以在所有檔案用的需求 07/12 17:34
EdisonX:@h大,即使用macro,還是要一直 include **.h 吧 ? 07/12 17:34
hakman:就不符合 07/12 17:35
diabloevagto:用這樣子的話,我一樣是要在每個地方都iclude abc.h 07/12 17:35
diabloevagto:吧 07/12 17:35
hakman:要 07/12 17:37
diabloevagto:嗯Orz 07/12 17:37
hakman:為什麼你想要只include 在main 其它地方就可以用? 07/12 17:39
james732:編譯的時候每一個 .c 檔都是獨立的,所以要各自加 07/12 17:40
hakman:照理來說,每個檔案都是獨立的程式 可以搭配不同的main 07/12 17:40
hakman:你這樣的感覺,好像那麼多檔案,都是需要一個特定的main 07/12 17:42
hakman:那...幹嘛分檔案? 07/12 17:42
hakman:所以可以麻煩你說明一下你的需求是? 07/12 17:43
EdisonX:他的需求只是貪懶,一份const能給所有檔案看到,又不想固定 07/12 17:44
EdisonX:include 某個 header,問有沒有方式可滿足貪懶的需求。 07/12 17:45
hakman:那,gcc compile 時 宣告特定macro 這樣可以嗎? 07/12 17:46
james732:我想到的也是從compiler的參數去著手 07/12 17:48
diabloevagto:對gcc參數沒研究...我都依賴IDE= = 07/12 17:48
EdisonX:對唷,可以執編譯,連結期時動手腳. d 大用的是哪款 IDE ? 07/12 17:49
james732:剛剛查了一下,gcc可以用-Dmacro[=defn]來設定 07/12 17:53
shadow0326:我覺得const比macro好 :~ 07/12 18:15
littleshan:你不做任何include 命名空間就多了一堆變數 07/12 18:44
littleshan:不覺得哪裡不太蘇湖嗎? 07/12 18:45
ianlini:我也試過這種include 編譯不會錯 (常數不就直接define? 07/12 20:18
ianlini:挖我漏看了一頁... 當我沒回吧XD 07/12 20:21
不好意思,我沒有講清楚需求。 我目前有一個project,用到滿多個class。 我將每一個class都分成.h跟.cpp。 因為是寫影像處理方面的程式所以有不少門檻值要做設定, 並且都是要隨著環境調整,但只有在環境改變得時候才要修改。 第一次修改好後,以後就都不用再修改。 每個class多少都有一兩個參數要做設定,假如我都寫在cpp內這樣要設定的時候 就要到好幾個檔案內修改,這樣很麻煩。 所以我就想說把那些參數拉出來另外一個.h檔內,但這有一個情況是在每個要用到的 .cpp內都要在include定義參數的.h檔一次,這樣挺麻煩的。 想說能不能做到懶人方法,就是在一開始的main檔內include一次就好,讓其他的 class都能夠看到那些參數。 不知道這樣解是有沒有比較清楚,麻煩大家了。 ※ 編輯: diabloevagto 來自: 140.125.20.92 (07/12 20:52)
littleshan:每個.cpp多加一行include → 這件事很簡單 07/12 21:19
littleshan:正常的 programmer 都應該能在三分鐘內搞定這件事 07/12 21:19
littleshan:還有另一個方法是設定IDE強制每個檔案都額外include 07/12 21:21
littleshan:不建議這個方法就是了 07/12 21:21
diabloevagto:了解!看來目前應該就是每個cpp都include一次 07/12 21:27
syuasdio:數字不會變的話我覺得用巨集就好了 07/13 01:05
EdisonX:const, macro 的戰爭基本上沒太大意義。 07/13 01:07
syuasdio:樓上,我沒有要戰啦,只是看完本文後的直覺想法 07/13 01:10
syuasdio:我承認我沒看到推文已經講過了 囧 07/13 01:11
loveme00835:extern 07/13 01:37
loveme00835:原來是想不用 include 的方法... include 說明了相依 07/13 01:39
loveme00835:性, 不 include 就能用那等於把相依性藏起來了, 你乾 07/13 01:42
loveme00835:脆實作全寫在 header 裡 07/13 01:42
linotwo:http://codepad.org/Wxdd53UB 07/13 08:12
linotwo:多一個 param.c 專門放參數的實體 07/13 08:13
linotwo:各個 cpp 要用的時候用 extern 的方式去 link 07/13 08:14
james732:不過那行 extern 還是要每個檔案都加上去...XDDD 07/13 09:07
diabloevagto:看來我應該在每個cpp都include,這樣比較能表示相依 07/13 14:45