64-разрядный на самом деле разум d'ГЄtre для NSInteger и NSUInteger; прежде 10.5, те не существовали. Эти два просто определяются как longs в 64-разрядном, и как ints в 32-разрядном:
#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
Таким образом, с помощью них вместо более основного C вводит, когда Вы хотите 'разрядно-собственный' размер.
Вы захотите использовать оператор преобразования препроцессора в строку, #
, и, возможно, оператор вставки токена, '##':
#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2( a, b) a##b
#define PASTE( a, b) PASTE2( a, b)
#define PRINTTHIS(text) \
NSLog(PASTE( @, STRINGIFY(text)));
I ' m не уверен, требует ли Objective-C, чтобы в '@' не было пробелов между ним и открывающей цитатой - если пробелы разрешены, отбросьте операцию PASTE ().
Обратите внимание, что вам понадобятся тупые 2 уровня косвенного обращения для STRINGIFY ()
и PASTE ()
для правильной работы с параметрами макроса. И это почти никогда не повредит, если вы не делаете что-то очень необычное (где вы не хотите, чтобы параметры макроса расширялись), поэтому использование этих операторов таким образом является довольно стандартным.
Вот один из способов написать макрос, который вставляет свой аргумент в текстовом виде в строковый объект, хотя мне это кажется немного корявым:
#define PRINTTHIS(text) NSLog((NSString *)CFSTR(#text))
Он использует оператор преобразования в строку, чтобы превратить аргумент в Строка C, которая затем используется для создания CFString, которая является бесплатной связью с NSString.
Я думаю, проблема в вас Мы сталкиваемся с тем, что «текст» находится внутри того, что препроцессору кажется строковым литералом (кавычки и, возможно, символ @), поэтому он не заменяет. Только предположение, но сработает ли это?
#define PRINTTHIS(text) \
NSLog(@"%@", text);
PRINTTHIS(@"string");
Вы также можете определить версию, которая принимает строки C вместо строк ObjC:
#define PRINTTHIS_C(text) \
NSLog(@"%s", text);
PRINTTHIS_C("string");
Используйте
#define PRINTTHIS(text) \
do { NSLog(@"%s", #text); } while(0)
Таким образом, текст может содержать символы%, его 'if-proof', полу- двоеточия находятся в нужном месте и т. д.
Однако лично я бы сказал, что имеет смысл просто использовать NSLog () напрямую.
Воспринимайте это с недоверием ... Я не разработчик Objective-C. Но в макросах, подобных функциям C, параметры макроса, появляющиеся внутри строковых литералов, не заменяются соответствующими фактическими аргументами, поэтому подстановка, которую вы пытаетесь сделать, не сработает.
Это может сработать:
#define PRINTTHIS(text) \
NSLog(@text);
PRINTTHIS("your message here");
(поэтому кавычки удалены из определения макроса. в этой конструкции. Поэтому, возможно, потребуется использовать оператор вставки токена ##:
#define PRINTTHIS(text) \
NSLog(@##text);