我正在查看一些开源项目,并且看到以下内容:
NSLog(@"%s w=%f, h=%f", #size, size.width, size.height)
尺寸符号前的“#”到底是什么意思?这是C字符串的某种前缀吗?
我正在查看一些开源项目,并且看到以下内容:
NSLog(@"%s w=%f, h=%f", #size, size.width, size.height)
尺寸符号前的“#”到底是什么意思?这是C字符串的某种前缀吗?
为了详细说明 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,但带有变量名)
这是宏定义的主体吗?然后#
可以用来对以下标识符进行字符串化,即打印“字符串”(不带代码)。
的正式名称#
是字符串化操作符。它接受其参数并将其括在引号中以使 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;