2013-10-25 33 views
0

我想使用某個namespace及其功能,以多種形式使用它們以具有各種共享功能。但是,我有鏈接器問題。在多個VCL模塊中使用命名空間

這裏是我做過什麼 - 我創建了一個新的單位和它裏面我的頭文件中寫道:

#ifndef MyHeaderH 
#define MyHeaderH 

namespace MyHeader 
    { 
    enum { SOMETHING1, SOMETHING2 }; 
    void SomeFunction(int Param); 
    } 

#endif 

當然,實際的功能在CPP文件中定義,上述是從h文件。

而且CPP文件如下:

#pragma hdrstop 
#include "MyHeader.h" 
#pragma package(smart_init) 

void SomeFunction(int Param) 
{ 
//some code here 
} 

所以在我的主要形式Form1我包括上述HPP文件Form1

MyHeader::SomeFunction(0); 

這一切編譯罰款鏈接器報告無法解析的外部。所以顯然它沒有看到名稱空間和函數。我如何解決這個問題?

作爲一個額外的問題 - 如果我用這樣的功能在幾種形式設置,它應該是所有編譯只有一次,右重用(它不會有我猜測的相同功能的多個副本?)

回答

2

您可能忘了將函數定義放在名稱空間中。

這是不是做過這樣你在頭文件做的,而是用一個函數體:

namespace MyHeader 
{ 
    void SomeFunction(int Param) 
    { 
     // ... 
    } 
} 

或者使用範圍的操作::

void MyHeader::SomeFunction(int Param) 
{ 
    // ... 
} 
+0

謝謝,我知道這是一些愚蠢的錯誤像那樣。在** cpp **文件中包含'MyHeader ::'之前的函數實現,現在編譯!那另一個問題呢 - 這個函數現在只在整個程序中編譯一次嗎? – Coder12345

+0

@ Coder12345是的,因爲只有一個*定義*,所以只會有一個函數副本。 –

2

實際函數在cpp文件中定義的方式是它不實現頭文件中聲明的接口。

實施

namespace MyHeader 
{ 
    void SomeFunction(int Param) { /* Your implementation goes here. */ } 
} 
在cpp文件