2013-08-17 101 views
0

我目前工作的一個頭只圖書館,我希望能夠用一些宏沒有他們是從客戶端代碼可用可用。例如:避免宏爲從客戶端代碼

// library_header1.h 

#define MACRO_NUMBER_1(__X__) doSomethingWith(__X__) // etc... 

class LibraryClass1 
{ 
    // We'll use the macro somewhere in here. 
}; 

現在,如果我包含library_header1.h,我可以使用MACRO_NUMBER_1。有什麼辦法可以避免嗎?

+0

'#undef'?...... –

+0

'#undef'似乎工作正常,但我也想知道是否有任何方式宏沒有定義(以便autocomplete/intellisense不給他們看)。 –

+0

您正在以源代碼形式提供您的圖書館。你不能希望隱藏實現。不管它是否顯示宏,它都取決於Intellisense的實現。對於Microsoft的編譯器,您可以檢查使用['#pragma push_macro'](http://msdn.microsoft.com/en-us/library/2bs04eza.aspx)/'pop_macro'是否對Intellisense實現有任何影響。 – IInspectable

回答

1

爲了防止庫用戶訪問宏 - 你可以把#undef當你知道你將不再需要你的宏了。

如果你想阻止智能感知/自動完成從曾經看到你的宏,您可以嘗試通過跳過它在宏定義欺騙它。通常你可以這樣做:

  • 設置你的編譯項目(visual solution,makefile,...),以便傳遞一個額外的「標識」宏。喜歡的東西-DIAMCOMPILING
  • 保護您的宏定義與#ifdef IAMCOMPILING ... #endif

你的IDE將最有可能無法識別IAMCOMPILING並跳過宏的定義。

做筆記但是,那麼IDE將感到困惑,當你在頭文件中實際使用的宏觀和一些不存在的錯誤將被標記。

1

儘管它不會阻止宏被IDE注意到,但是如果對宏使用一個不尋常的前綴,它將不太可能與用戶想要做的事發生衝突,進攻。它可能不是理想的解決方案,但與前綴CCC或XWX或別的東西,是不可能通過正常的程序員使用可以幫助宏。

(或不使用宏始終是一個可行的解決方案!)

+0

好的想法。但是,使用Visual Assist的[Acronymms](http://www.wholetomato.com/products/features/acronym.asp)時,使用不常用字符組合的前綴將失敗。突然之間,你所有不尋常的組合都將是潛在的用戶輸入。此外,我很高興看到一個非宏觀版本正確評估'__LINE__'。偶爾,宏是必需的。 – IInspectable

3

其他已經提到#undef但如果你有你需要取消定義的宏,你需要在許多頭使用它們?這種情況可以通過定義頭文件和定義未定義的宏來處理,並且包含指定的頭文件。例如:

// temp-macros.h 
#if defined(OUTER) 
# define MACRO x 
# include OUTER 
# undef MACRO 
# undef OUTER 
#endif 

的想法是從其中宏neede報頭中設置了OUTER,包括temp-macros.h和在第二包含使用宏:

// macro-use.h 
#if !defined(OUTER) 
# define OUTER "macro-use.h" 
# include "temp-macros.h" 
#elif !defined(INCLUDED_MACRO_USE) 
# define INCLUDED_MACRO_USE 
void use(int MACRO) { /*...*/ } 
#endif 

當然,本實施例中的用途只是一個微不足道的宏,但如果有更多的宏,而且它們更復雜,這種方法可能會有用。