Препроцессор C на Mac OSX / iPhone, использование клавиши «#»? - PullRequest
2 голосов
/ 28 апреля 2009

Я смотрю на некоторые проекты с открытым исходным кодом и вижу следующее:

NSLog(@"%s w=%f, h=%f", #size, size.width, size.height)

Что именно означает «#» перед символом размера? Это какой-то префикс для C строк?

Ответы [ 3 ]

8 голосов
/ 28 апреля 2009

Чтобы уточнить ответ Диркгентли, это похоже на реализацию макроса, который принимает аргумент NSSize (или аналогичный) и печатает имя переменной (то, что делает #; преобразование имени переменной в строка, содержащая имя переменной), а затем ее значения. Итак, в:

NSSize fooSize = NSMakeSize(2, 3);
MACRO_NAME_HERE(fooSize);

макрос расширится до:

NSLog(@"%s w=%f h=%f", "fooSize", fooSize.width, fooSize.height);

и печать:

fooSize w=2.0 h=3.0

(аналогично NSStringFromSize, но с именем переменной)

4 голосов
/ 29 апреля 2009

Официальное имя # - это оператор строкового преобразования . Он принимает аргумент и заключает его в кавычки, чтобы сделать строку C константой, избегая при необходимости любых встроенных кавычек или обратной косой черты. Это разрешено только внутри определения макроса - это не разрешено в обычном коде. Например:

// This is not legal C
const char *str = #test

// This is ok
#define STRINGIZE(x) #x
const char *str1 = STRINGIZE(test);      // equivalent to str1 = "test";
const char *str2 = STRINGIZE(test2"a\"");  // equivalent to str2 = "test2\"a\\\"";

Связанным оператором препроцессора является оператор вставки токена ##. Для получения одного токена требуется два токена и вставка их вместе. Как и оператор строкового преобразования, он допускается только в определениях макросов, а не в обычном коде.

// This is not legal C
int foobar = 3;
int x = foo ## bar;

// This is ok
#define TOKENPASTE(x, y) x ## y
int foobar = 3;
int x = TOKENPASTE(foo, bar);  // equivalent to x = foobar;
4 голосов
/ 28 апреля 2009

Это тело определения макроса? Затем # можно использовать для преобразования в строку следующего идентификатора, то есть для вывода «строки» (без кодов).

...