編號 |
Lib |
Exe |
1 |
bool glbFunc(Cls&){return true;} |
bool glbFunc(Cls&){return false;},不可 |
inline bool glbFunc(Cls&){return false;},不可 |
2 |
inline bool glbFunc(Cls&){return true;} |
bool glbFunc(Cls&){return false;},可以 |
inline bool glbFunc(Cls&){return false;},可以 |
3 |
class Cls{ public: void clsFunc(){} }; |
class Cls{ public: void clsFunc(){} };,可以 |
class Cls{ public: void clsFunc(); }; void Cls::clsFunc(){},可以 |
4 |
class Cls{ public: void clsFunc(); }; void Cls::clsFunc(){} |
class Cls{ public: void clsFunc(){} };,可以 |
class Cls{ public: void clsFunc(); }; void Cls::clsFunc(){},不可 |
5 |
class Cls{ public: static const int i=1; }; |
class Cls{ public: static const int i=2; };,可以 |
class Cls{ public: static const int i; }; const int Cls::i=2;,不可 |
6 |
class Cls{ public: static const int i; }; const int Cls::i=1 |
class Cls{ public: static const int i=2; };,不可 |
class Cls{ public: static const int i; }; const int Cls::i=2;,不可 |
補充:
1、 如上表編號1所示,非內聯全域函數glbFunc使用了class Cls,如果Exe工程中重新定義了glbFunc,則編譯報錯,因為glbFunc已經在Lib工程中被定義了一次。但是,如果在Exe工程中重新定義glbFunc的同時,重新定義了class Cls,則編譯通過,此時使用Exe工程中的glbFunc和class Cls。
2、 存在以下情形:
Lib工程中使用編號2的方式定義內聯全域函數glbFunc,使用編號4的方式定義class Cls的clsFunc函數;Exe工程中重新定義全域函數glbFunc(內聯或非內聯均可),那麼,在Exe工程中調用全域函數glbFunc,將調用Exe工程中定義的全域函數glbFunc,該函數中使用的class Cls,將使用Lib工程中定義的class Cls!這樣很容易出現問題,所以,在產生Lib工程時,應慎用內嵌函式,同時,不要將函數實現放入標頭檔(.h檔案)中,而應該將實現全部放入.cpp檔案中。
以上為我自己的實驗結果,缺乏理論分析,大家可以自己思考下。