【问题标题】:Interpreting C pre pre processor code解释 C 预处理器代码
【发布时间】:2014-07-18 15:22:41
【问题描述】:

给定#define LOG_OBJECT(object) (NSLog(@"" #object @" %@ %@:%d”, [object description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__)); 语句LOG_OBJECT(self); 将产生:

2014-07-18 17:43:30.041 FrogCamera[12484:2144843] 自我 ViewController.m:20

我想了解预处理器代码的工作原理。如何查看预处理器产生的语句?

具体来说:

  1. 为什么整个#define 语句都包含在( ) 中?
  2. #object 是提供的任何值的文本替换吗?
  3. 为什么在#object 之前需要@""
  4. @“” #object @“ %@ %@:%d”如何转化为@"self %@ %@:%d"

这是一个用法示例:

@interface ViewController ()
#define LOG_OBJECT(object)  (NSLog(@"" #object @" %@ %@:%d", [object description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    LOG_OBJECT(self);
    // = 2014-07-18 17:48:19.439 FrogCamera[12597:2151087] self <ViewController: 0x79755000> ViewController.m:20
    (NSLog(@"self %@ %@:%d", [self description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
    // = 2014-07-18 17:48:19.440 FrogCamera[12597:2151087] self <ViewController: 0x79755000> ViewController.m:21
}
@end

请参阅GlobalUtilities.h 了解 LOG_OBJECT 语句的来源。

【问题讨论】:

  • 基于 C, 2. # 是一个运算符。 4. 连接相邻的字符串字面量。

标签: objective-c c-preprocessor stringification


【解决方案1】:

这很简单:

  1. 宏中的括号在每次扩展宏可能会做一些意想不到的事情时使用。一个典型的例子是:
    #define SUM(A, B) A + B
    SUM(1, 1) * 3 //the expected result is 6, the real result is 1 + 1 * 3 = 4 
    在每个宏周围添加括号是防止此类错误的良好编程约定。
  2. #paramstringification 运算符。它将参数用引号括起来 - 例如,参数 value 被转换为 "value"
  3. 字符串化运算符创建一个 C 字符串,它是一个字符数组 (char *)。作者想要一个NSString *,这就是他在开头添加@ 的原因。请注意,@"aaa" "bbb" 等价于 @"aaabbb"(此功能使我们能够将字符串拆分为多行)。但是,这不是很优雅。使用%s 会更简单一些。
  4. 仅转换为@"" "self" @" %@ %@:%d"。编译器将连续的字符串视为一个字符串。

【讨论】:

    【解决方案2】:

    如果您想查看预处理器宏扩展的内容,请在打开文件的情况下点击Product菜单,然后点击Perform Action->PreProcess "ViewController.m"。这将让您看到已替换宏的扩展源的样子。有关宏可以做什么的更多详细信息,请参阅Apple Docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多