2013-05-15 48 views
3

我想用CocoaLumberjack,我試圖插入我的.PCH文件ddLogLevelconst在預編譯頭定義常量 - 如何避免重複

#if DEBUG 
static const int ddLogLevel = LOG_LEVEL_VERBOSE; 
#else 
static const int ddLogLevel = LOG_LEVEL_INFO; 
#endif 

然而,由於我使用XMPP架構,並使用CocoaLumberjack,我得到Redefinition of 'ddLogLevel'錯誤,因爲這些類包含完全相同const定義如上。

我絕對不想在每一個類中定義ddLogLevel來避免這種情況。我怎樣才能解決這個問題?

回答

2

你可以在它周圍加一個警衛。事情是這樣的:

#ifndef ddLogLevel 
#if DEBUG 
static const int ddLogLevel = LOG_LEVEL_VERBOSE; 
#else 
static const int ddLogLevel = LOG_LEVEL_INFO; 
#endif //DEBUG 
#endif //ddLogLevel 

如果您不能使用ddLogLevel作爲一個後衛:(現在不能測試)

#ifndef DDLOGLEVEL 
#if DEBUG 
#define DDLOGLEVEL 
static const int ddLogLevel = LOG_LEVEL_VERBOSE; 
#else 
static const int ddLogLevel = LOG_LEVEL_INFO; 
#endif //DEBUG 
#endif //DDLOGLEVEL 

我希望它的作品。

+0

嗯,所以現在我學會了#的語法ifndef,但是,相同的錯誤。我的推測是,如果我把它放在我的.pch中,那麼ddLogLevel尚未在任何地方定義。 .pch代碼會進入每個課程的頂部,對吧?所以當XMPPFramework文件定義ddLogLevel時,這就是我得到錯誤的地方。還有很多XMPPFramework類。我不想改變它們。 – Ramsel

+0

@SmoothAlmonds:爲什麼它需要成爲.pch?難道你不能只使用一個正常的.h(那麼它會通過#include插入到每個文件中)? – Burkhard

+0

所以如果我使用普通的.h,那麼自動將每個文件自動放入每個文件的唯一方法就是將該標題放入.pch中,對不對?事情是,我想在每個班級中使用DDLog,所以我希望它可以自動提供,而無需手動包含它。我理解你錯了嗎? – Ramsel

0

裹定義的預處理指令:

#ifndef DEFINED_DD_LOG_LEVEL 
#define DEFINED_DD_LOG_LEVEL 
# if DEBUG 
... 
# endif // DEBUG 
#endif // DEFINED_DD_LOG_LEVEL 
1

我想答案是不申報ddLogLevel靜態

相反(如本指南https://github.com/CocoaLumberjack/CocoaLumberjack/wiki/XcodeTricks中指出),按照這個Global log level for cocoalumberjack

這與MagicalRecord遇到的相似Magical Record takes ownership of ddLogLevel

Constant.h

extern int const ddLogLevel; 

Constant.m

#import <CocoaLumberjack/DDLog.h> 
#ifdef DEBUG 
    int const ddLogLevel = LOG_LEVEL_VERBOSE; 
#else 
    int const ddLogLevel = LOG_LEVEL_WARN; 
#endif 

此外,有些人似乎不明白什麼static關鍵字的頭文件指,所以閱讀本Variable declarations in header files - static or not?