[問題] 一般function用static修飾

看板C_and_CPP作者 (青)時間16年前 (2009/10/17 18:45), 編輯推噓3(3025)
留言28則, 6人參與, 最新討論串1/1
請教一下各位一個static的用法 一般來說,static有三種比較常用的用法 一是在函數內的變數,讓他可以紀錄用途 二是用在不同檔案間,不可共用的變數 三是用在static的data member及member function 那想請教的是第二種的變形 當我有個function放在某個.cpp檔實做時,加上static修飾 那麼他所代表的意義是什麼? 因為我實際測試的結果,其他地方也可以呼叫他 並不是第二種的用法(讓此函數僅在此檔案使用) 所以還請各位指點一下,謝謝 -- ˍˍ 如果我手中有酒,希望與你共飲。 ▕羽人▏ 如果我手上有刀,希望與你一同抗敵。▕非獍▏  ̄ ̄ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.1.225

10/17 19:11, , 1F
推一下, 小弟最近看別人的code也有同樣的問題@_@"
10/17 19:11, 1F

10/17 19:20, , 2F
不行,用VC9編譯器,預設Win32主控台專案編成C
10/17 19:20, 2F

10/17 19:21, , 3F
錯誤1 error LNK2019: 無法解析的外部符號 _bar 在函式
10/17 19:21, 3F

10/17 19:21, , 4F
加上 static 的函數會變成 internal linkage 無法連結
10/17 19:21, 4F

10/17 19:23, , 5F
難道你include了cpp檔?
10/17 19:23, 5F

10/17 19:28, , 6F
目前我是將它include進去了
10/17 19:28, 6F

10/17 19:28, , 7F
將它拉出來的話,就沒辦法編譯過了
10/17 19:28, 7F

10/17 19:29, , 8F
目前的是.h:static void Test();
10/17 19:29, 8F

10/17 19:29, , 9F
.cpp:實做Test()
10/17 19:29, 9F

10/17 19:29, , 10F
然後include .h檔進來
10/17 19:29, 10F

10/17 19:32, , 11F
不過如果將實做移到.h的話,卻又可以編譯過
10/17 19:32, 11F

10/17 19:33, , 12F
請教一下,為什麼會造成這樣的結果?
10/17 19:33, 12F

10/17 19:39, , 13F
include就只是在該地,展開被include檔內容而已吧
10/17 19:39, 13F

10/17 19:40, , 14F
實做放.h就等於你把函數寫在同一個檔案,產生同個obj了
10/17 19:40, 14F

10/17 19:40, , 15F
意思就是這樣做的時候,沒有連結的需要
10/17 19:40, 15F

10/17 19:41, , 16F
所以對.h來說,其實只是一個巨集而已是嗎?
10/17 19:41, 16F

10/17 19:41, , 17F
我的意思是,.h對main.cpp而言只是個巨集而已是嗎?
10/17 19:41, 17F

10/17 19:41, , 18F
如果我沒搞錯,那是這樣沒錯
10/17 19:41, 18F

10/17 19:44, , 19F
這樣我明白了,謝謝指點
10/17 19:44, 19F

10/17 20:20, , 20F
static 就限制該檔案專有的function
10/17 20:20, 20F

10/17 20:21, , 21F
你把實作寫在.cpp那他就會當成不同檔案 一個是main.cpp
10/17 20:21, 21F

10/17 20:21, , 22F
一個是你另一個cpp寫的實作 但是main.cpp看到的只有.h的宣告
10/17 20:21, 22F

10/17 20:22, , 23F
所以他會說你沒有定義~
10/17 20:22, 23F

10/17 21:06, , 24F
static 修飾 function 代表 internal linkage ...
10/17 21:06, 24F

10/17 21:49, , 25F
謝謝兩位,不過想請教一下l大,什麼叫linkage?
10/17 21:49, 25F

10/17 22:49, , 27F
function 預設是 external linkage
10/17 22:49, 27F

10/18 07:24, , 28F
謝謝l大,我會詳細看一下
10/18 07:24, 28F
文章代碼(AID): #1AsQ1J7U (C_and_CPP)