iPhone — Использование макросов препроцессора в objective c / XCode

#objective-c #xcode #ios4 #xcode4

#objective-c #xcode #ios4 #xcode4

Вопрос:

Я настраиваю некоторые макросы для ведения журнала.

 #define LOG_NETWORK_DEBUG(...)    LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"Network",2,__VA_ARGS__)
#define LOG_NETWORK_INFO(...)    LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"Network",1,__VA_ARGS__)
#define LOG_NETWORK_ERROR(...)    LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"Network",0,__VA_ARGS__)


#define LOG_MEDIA_DEBUG(...)    LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"Media",2,__VA_ARGS__)
#define LOG_MEDIA_INFO(...)    LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"Media",1,__VA_ARGS__)
#define LOG_MEDIA_ERROR(...)    LogMessageF(__FILE__,__LINE__,__FUNCTION__,@"Media",0,__VA_ARGS__)
  

Однако, поскольку мой код в настоящее время заражен вызовами with NSLog, я хочу перевести NSLog вызовы в LogMessageF calls. (пока у меня не будет времени перенести весь мой код на вышеуказанные макросы)
В настоящее время мой проект состоит из 2 подпроектов: Network, Media.

Я хочу, чтобы каждый вызов NSLog был преобразован в соответствующий макрос. (Вызовы NSLog в медиа-проекте будут преобразованы в LOG_MEDIA_DEBUG).

Я подумал о настройке макросов препроцессора в XCode для каждого проекта с именем PROJ_NAME, который будет включать название проекта.

Мой вопрос в том, как использовать этот макрос? Я хочу сделать что-то вроде этого:

 #define NSLog(...) LOG_$PROJ_NAME_DEBUG(__VA_ARGS__)
  

Ответ №1:

Вы можете использовать (конкатенацию токенов). ВСПОМОГАТЕЛЬНЫЙ макрос используется для оценки макроса PROJ_NAME перед конкатенацией.

 #define PROJ_NAME NETWORK

#define LOG_DEBUG(P) LOG_##P##_DEBUG
#define HELPER(X) LOG_DEBUG(X)
#define NSLog(...) HELPER(PROJ_NAME)(__VA_ARGS__)