#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__)