看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Ubuntu 17.04 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) G++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) omp 問題(Question): 大家好,我試著把我的C的檔案改成C++來使用,但是因為我的變數是另外在.h檔裡面宣告 後,再在main裡面來使用,並且用 #include "xxxx.hpp" 給main和main下面的其他子程式 使用,原本C這樣做沒問題,但這時改成C++後問題就來了,如果我在xxxx.hpp裡面用C原 本的宣告方式,如下 double x,y,vx,vy,......; int i,j,k,l,......; double f[10][10],......; 編譯後顯示 initial.o:(.bss+0x0): multiple definition of `x' main.o:(.bss+0x0): first defined here initial.o:(.bss+0x8): multiple definition of `v' main.o:(.bss+0x8): first defined here . . . collect2: error: ld returned 1 exit status Makefile:15: recipe for target 'a.out' failed make: *** [a.out] Error 1 而後我改用 class xxxx { //宣告變數 public: . . . } 雖然這樣會成功,但我必須要在每一個變數前面加上xxxx. 也就是說我必須要在每個子程式裡面寫成 xxxx test test.f[ix][iv] = xxxx.x*xxxx.v 這樣的形式,每次都要打很多字母,其實有點麻煩,請問有沒有比較簡化的語法呢? 可以讓我即使是在一個檔案裡面宣告好參數,就可以在所有的檔案裡面使用,對於C++還 不是很熟,還請指點迷津,先謝謝大家。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.142.73.183 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1518459173.A.AC6.html
hakman: hpp 是啥 Orz 另外,不要在.h 檔裏面宣告變數 02/13 04:21
hakman: 你可以看看 extern 02/13 04:21
hakman: 另外,應該可以不用改吧 直接 extern "C" 可以用吧? 02/13 04:23
hakman: PS: extern 跟 extern "C" 請不要混淆一起看,兩者的建議 02/13 04:23
hakman: 是不同的事情 02/13 04:23
hakman: hpp 查到了,我孤陋寡聞,抱歉 Orz 02/13 04:25
LPH66: 這跟 extern "C" 無關, 是 C++ 的 ODR 規則的關係 02/13 06:56
LPH66: 這種多檔間的共享全域變數需要宣告為外部 (extern) 02/13 06:56
LPH66: 然後在其中一個 .cpp 當中實際宣告之 02/13 06:56
LPH66: 不過建議原 PO 考慮一下將這些全域變數做為函數的參數傳入 02/13 06:57
LPH66: 因為這其實是很危險的寫法, 變數誰改了都不知道 02/13 06:58
LPH66: (事實上不只 C++, 這種寫法也不建議 C 使用) 02/13 06:59
steve1012: 全域變數能免則免 02/13 07:11
peterwu4: namespace ? 02/13 10:23
loveflames: C有tentative definition,C++沒有 02/13 10:34
loveflames: C++不該在header去定義extern變數,宣告可以 02/13 10:35
hunandy14: 幫你找了一個範例 https://goo.gl/QfrByv 02/13 11:24