2016-04-25 101 views
1

讀過這個線程計算器:Strange class declaration ,但仍與下面的代碼混淆在foo.h一個奇怪的C++類的聲明

class Foo CHECKLEAKDCL { 

我相信,富應該是類名,因爲有構造函數和解構者可以暗示這一點。

我在這個.h文件中看不到與CHECKLEAKDCL相關的任何宏定義。

也是我感到困惑的答案爲Strange class declaration,其中說:

Q_CORE_EXPORT不是標識符。它是一個與平臺相關的宏,它用於指示一個旨在跨越 庫邊界使用的類。

任何人都可以對此有更多的解釋嗎?


UPDATE:發現這條線在.h文件中,它包括在foo.h

#define CHECKLEAKDCL : private CheckLeak 

所以類信息聲明應該是:

class Foo : private CheckLeak { 

所以Foo是extend ing CheckLeak,對嗎?

+2

搜索'CHECKLEAKDCL'的整個項目,必須將其定義爲某處的預處理器宏。 –

+1

看看這個:http://stackoverflow.com/questions/7840874/what-does-it-mean-when-a-class-declaration-appears-to-have-two-names我希望它可以幫助你= D – Nestoraj

+0

無論是那個還是'​​Foo'都被定義爲一個擴展爲空的預處理器宏,或者更糟糕的是擴展爲'{}; class'。 –

回答

1

如果你爲Windows編譯(使用Visual Studio),極有可能會進行評估,以Microsoft專用鏈接標識符之一,dllexportdllimport

https://msdn.microsoft.com/en-us/library/81h27t8c.aspx

在創建它是用來類將從DLL中導出或從應用程序中的DLL中使用,並且依賴於它的評估結果爲dllexport(導出類的DLL)或dllimport(導入類的應用程序)。

如果使用GCC進行編譯,可能會評估爲gcc _-attribute__之一。如__attribute__ ((visibility ("default")))https://gcc.gnu.org/wiki/Visibility

這些擴展核心下用編譯器提供++做某些任務更容易實現(https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Extensions.html

編輯

你答案更新後好... ,顯然你有一個類的私人繼承。但請注意,這是一個可怕的宏你有沒有因爲

#define CHECKLEAKDCL : private CheckLeak 

在類的聲明增加了一個:所以你不能使用該符號再從基類繼承。

我建議你得到完全消除,宏觀的,如果你不能,不要使用它,它會混淆你的代碼。

+0

剛開始學習C++。有了這個宏,我將無法使用':'來繼承任何類? – ZhaoGang

1

我們無法確切知道它是什麼,因爲我們的信息甚至比您少。

通常情況下,我看到這樣的宏決心導出宏,爲圖書館。

也就是說,它的值應該定義爲dllexport,dllimportextern(取決於平臺)。 儘管如此,該宏出現在類名前面。

考慮到宏觀類名後出現,它只能解析到一個基類,或基類的列表,或空宏。

如果你的文檔,搜索跟蹤或報告它的地址來建設和破壞的內存跟蹤器的基類。

然後,代碼庫應該使用類似於此一宏定義被編譯:

#define CHECKLEAKDCL() : private MemoryTrackingBaseClass 

(其中MemoryTrackingBaseClass是我上面提到的類 - 根據你的編輯,CheckLeak)。

如果你想簡單地編譯,請嘗試使用:

#define CHECKLEAKDCL() 

編輯(解決您的更新)

所以美孚正在擴大CheckLeak,對不對?

只有當你想檢查你的應用程序的泄漏,使用任何CheckLeak實現。

在生產環境中(在使用繼承自CheckLeak的定義之後),您應該將CHECKLEAKDCL定義爲空宏(用於速度)。

0

正如你已經發現,CHECKLEAKDCL是擴展到三個令牌: private CheckLeak宏。據推測CheckLeak是一個類,它添加了一些泄漏檢查診斷行爲,從它繼承的類。

一般情況下,這種混淆是不是非常有幫助。根據CheckLeak的屬性,該宏可能具有意想不到的副作用,例如將看起來像標準佈局類的東西變成非標準佈局類。

這也將是很難添加CHECKLEAKDCL到想從另一個類繼承任何其他原因的類。 (你應該class Foo CHECKLEAKDCL, public OtherBase?)

就個人而言,如果有機會改善這個項目,我希望在這種情況下用它的實際擴展替換這個宏。