[問題] undeclared(first used in this function

看板C_and_CPP作者 (Mx. YAN)時間12年前 (2013/12/18 20:52), 編輯推噓11(11027)
留言38則, 10人參與, 最新討論串1/1
問題(Question): 一個簡單的程式 但是一直出現這個error `plus' undeclared (first use this function) 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> using namespace std; void plus(); void plus() { } int main() { plus(); system("PAUSE"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.24.211

12/18 21:35, , 1F
std::plus() 是有被定義的 你要換掉嗎?
12/18 21:35, 1F

12/18 21:36, , 2F
如果你只是要加自己的function 換個名字就好
12/18 21:36, 2F
謝謝 可以了

12/18 21:52, , 3F
到底為甚麼很多教學都會叫人直接using namespace...
12/18 21:52, 3F
這要問其他人了 ^^" 我也不是很清楚 ※ 編輯: nature23306 來自: 123.192.24.211 (12/18 21:58)

12/18 22:26, , 4F
因為要寫std::cout跟std::endl很麻煩?
12/18 22:26, 4F

12/18 22:26, , 5F
很多IDE開完專案也直接就是using namespace std就是了
12/18 22:26, 5F

12/18 22:40, , 6F
using namespace並沒有錯,錯在他擺在函式宣告前面
12/18 22:40, 6F

12/18 22:46, , 7F
using沒錯,可以直接std::cout就好
12/18 22:46, 7F

12/18 23:54, , 8F
加上 std:: 或 boost:: 才帥才強阿
12/18 23:54, 8F

12/18 23:54, , 9F
網路上用這個就能大致分別出範例有沒有看的必要
12/18 23:54, 9F

12/18 23:59, , 10F
書或教學上使用using namspace可以省字數讓畫面更簡潔
12/18 23:59, 10F

12/18 23:59, , 11F
但實務上很有可能造成名稱衝突的問題。
12/18 23:59, 11F

12/19 02:20, , 12F
實務上就是因為名字太長會很難閱讀,難閱讀就難維護
12/19 02:20, 12F

12/19 02:22, , 13F
namespace的設計用意就是讓你可以用短名字讓程式好讀
12/19 02:22, 13F

12/19 02:23, , 14F
而遇到名稱衝突時又可以指定完整名稱來解決
12/19 02:23, 14F

12/19 02:24, , 15F
如果都不用using,那倒不如把::全部換成底線,還比較短
12/19 02:24, 15F

12/19 11:09, , 16F
問題是很多教學命名空間都很後面
12/19 11:09, 16F

12/19 11:13, , 17F
況且這時的std::cout不長至少primer5為如此
12/19 11:13, 17F

12/19 12:54, , 18F
自己設計的code加上自己的namespace不就好了
12/19 12:54, 18F

12/19 14:50, , 19F
難閱讀為何會難維護? 我覺得看到一個 plus 還要去想他
12/19 14:50, 19F

12/19 14:51, , 20F
上面沒講好 是說為何多加會變得難維護?
12/19 14:51, 20F

12/19 14:52, , 21F
看到 plus 還要去追他到底是哪個 ns, 不就失去 ns 本意
12/19 14:52, 21F

12/19 14:54, , 22F
自己的 project 我會 using 自己的 namespace, 但避免
12/19 14:54, 22F

12/19 14:55, , 23F
using std or boost, 必要可在 function 內設定 alias
12/19 14:55, 23F

12/19 17:20, , 24F
如果你會去想某個symbol在哪個ns,表示名稱有衝突
12/19 17:20, 24F

12/19 17:21, , 25F
而名稱有衝突的時候本來就要加上ns來區分
12/19 17:21, 25F

12/19 17:23, , 26F
但是當你根本沒有自己的cin/cout時,不寫std::也很清楚
12/19 17:23, 26F

12/19 17:26, , 27F
所謂的難閱讀,是當一個type又臭又長十幾個字時
12/19 17:26, 27F

12/19 17:26, , 28F
前面那些 XXX::xxx::XXX 都是在擾亂你的注意力
12/19 17:26, 28F

12/19 17:31, , 29F
參考一下Java或C#的設計,引用模組時就自動using了
12/19 17:31, 29F

12/19 17:31, , 30F
因為名字太長真的很困擾啊
12/19 17:31, 30F

12/19 20:26, , 31F
XXX::XXX::XXX 應該是 nested namespace 的問題?
12/19 20:26, 31F

12/19 20:51, , 32F
Java 並不是引用時自動 using, 而是它的 import 就等於 C++
12/19 20:51, 32F

12/19 20:51, , 33F
裡的 using; 在 java 裡不寫 import 一樣是可以寫全名引用的
12/19 20:51, 33F

12/19 20:52, , 34F
寫 import 的目的跟 C++ 的 using 一樣都是引入簡名直接用
12/19 20:52, 34F

12/19 20:53, , 35F
java 的 import 也能夠單獨 import 某個 class, 這跟 C++ 的
12/19 20:53, 35F

12/19 20:53, , 36F
單獨 using 某個名字是異曲同工
12/19 20:53, 36F

12/19 22:32, , 37F
嗯,這邊是我搞錯了,Java或C#的行為和我想的不同
12/19 22:32, 37F

12/19 22:33, , 38F
但我覺得在Java或C#中直接using是很正常的動作
12/19 22:33, 38F
文章代碼(AID): #1IiPgXO0 (C_and_CPP)