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