【问题标题】:C preprocessor on Mac OSX/iPhone, usage of the '#' key?Mac OSX/iPhone 上的 C 预处理器,“#”键的使用?
【发布时间】:2009-04-28 18:15:08
【问题描述】:

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

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

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

【问题讨论】:

  • 很好奇...您不会碰巧手边有实际项目的名称和此代码的位置,对吗?正如 dirkgently 所暗示的那样,肯定还有其他事情发生,因为这甚至不适合我。
  • 它实际上来自 Joe Hewitt 的 Three20 项目。定义如下所示:#define TTLOGRECT(rect) \ TTLOG(@"%s x=%f, y=%f, w=%f, h=%f", #rect, rect.origin.x, rect. origin.y,\rect.size.width,rect.size.height)

标签: objective-c cocoa cocoa-touch c-preprocessor stringification


【解决方案1】:

为了详细说明 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,但有变量名)

【讨论】:

    【解决方案2】:

    # 的正式名称是 字符串化操作符。它接受其参数并将其括在引号中以使 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;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        相关资源
        最近更新 更多