2013-07-19 112 views
0

我試圖發現一些庫鏈接的意義,發現這個在標題:解讀頭文件

#ifndef LAPACK_GLOBAL 
#if defined(LAPACK_GLOBAL_PATTERN_LC) || defined(ADD_) 
#define LAPACK_GLOBAL(lcname,UCNAME) lcname##_ 
#elif defined(LAPACK_GLOBAL_PATTERN_UC) || defined(UPPER) 
#define LAPACK_GLOBAL(lcname,UCNAME) UCNAME 
#elif defined(LAPACK_GLOBAL_PATTERN_MC) || defined(NOCHANGE) 
#define LAPACK_GLOBAL(lcname,UCNAME) lcname 
#else 
#define LAPACK_GLOBAL(lcname,UCNAME) lcname##_ 
#endif 
#endif 

我不明白這些事,特別是當它返回的後綴##_

由於

+0

如果您針對每個您感到困惑的編譯器指令單獨分解此問題,您可能會得到更多答覆。您可能無法獲得解釋上述代碼中每條編譯器指令的答案。 –

回答

1

在C預處理,##是令牌連接運算符。因此lcname##_可以被解讀爲「通過將_放在lcname的末尾來創建新的令牌」。

我推定該引用預處理代碼是定義宏LAPACK_GLOBAL一個預處理器,其意圖被使用如下:

#define LAPACK_something LAPACK_GLOBAL(something, SOMETHING) 

之後任何使用LAPACK_something將通過以下中的一個取代:

something 
something_ 
SOMETHING 

取決於環境。

+0

完美清晰。謝謝! – Ryanmt