2013-07-19 61 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