Как сделать макрос, который может взять строку?

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 вводит, когда Вы хотите 'разрядно-собственный' размер.

CocoaDev имеет еще некоторую информацию

19
задан Another Registered User 25 November 2009 в 00:15
поделиться

5 ответов

Вы захотите использовать оператор преобразования препроцессора в строку, # , и, возможно, оператор вставки токена, '##':

#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 () для правильной работы с параметрами макроса. И это почти никогда не повредит, если вы не делаете что-то очень необычное (где вы не хотите, чтобы параметры макроса расширялись), поэтому использование этих операторов таким образом является довольно стандартным.

13
ответ дан 30 November 2019 в 03:34
поделиться

Вот один из способов написать макрос, который вставляет свой аргумент в текстовом виде в строковый объект, хотя мне это кажется немного корявым:

#define PRINTTHIS(text) NSLog((NSString *)CFSTR(#text))

Он использует оператор преобразования в строку, чтобы превратить аргумент в Строка C, которая затем используется для создания CFString, которая является бесплатной связью с NSString.

9
ответ дан 30 November 2019 в 03:34
поделиться

Я думаю, проблема в вас Мы сталкиваемся с тем, что «текст» находится внутри того, что препроцессору кажется строковым литералом (кавычки и, возможно, символ @), поэтому он не заменяет. Только предположение, но сработает ли это?

#define PRINTTHIS(text) \
    NSLog(@"%@", text);

PRINTTHIS(@"string");

Вы также можете определить версию, которая принимает строки C вместо строк ObjC:

#define PRINTTHIS_C(text) \
    NSLog(@"%s", text);

PRINTTHIS_C("string");
3
ответ дан 30 November 2019 в 03:34
поделиться

Используйте

#define PRINTTHIS(text) \
  do { NSLog(@"%s", #text); } while(0)

Таким образом, текст может содержать символы%, его 'if-proof', полу- двоеточия находятся в нужном месте и т. д.

Однако лично я бы сказал, что имеет смысл просто использовать NSLog () напрямую.

4
ответ дан 30 November 2019 в 03:34
поделиться

Воспринимайте это с недоверием ... Я не разработчик Objective-C. Но в макросах, подобных функциям C, параметры макроса, появляющиеся внутри строковых литералов, не заменяются соответствующими фактическими аргументами, поэтому подстановка, которую вы пытаетесь сделать, не сработает.

Это может сработать:

#define PRINTTHIS(text) \
    NSLog(@text);

PRINTTHIS("your message here");

(поэтому кавычки удалены из определения макроса. в этой конструкции. Поэтому, возможно, потребуется использовать оператор вставки токена ##:

#define PRINTTHIS(text) \
        NSLog(@##text);
0
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: