2

我正在查看一些开源项目,并且看到以下内容:

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

尺寸符号前的“#”到底是什么意思?这是C字符串的某种前缀吗?

4

3 回答 3

8

为了详细说明 dirkgently 的答案,这看起来像是一个宏的实现,它接受一个 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,但带有变量名)

于 2009-04-28T18:46:41.803 回答
4

这是宏定义的主体吗?然后#可以用来对以下标识符进行字符串化,即打印“字符串”(不带代码)。

于 2009-04-28T18:20:04.503 回答
4

的正式名称#字符串化操作符。它接受其参数并将其括在引号中以使 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;
于 2009-04-29T04:44:38.230 回答