【问题标题】:How to debug/log preprocessor macros in Xcode (iOS)?如何在 Xcode (iOS) 中调试/记录预处理器宏?
【发布时间】:2015-05-11 10:11:20
【问题描述】:

问题如题,主要目的是为了能够高效调试一些runtime-version-specific或者scheme-specific的代码。

例如,是否可以在 xcode 的控制台中记录 DEBUG 的值?

编辑:

我应该重新表述这个问题,我知道我们可以使用NSLog("DEBUG = %d", DEBUG); 记录宏的值(谢谢@rmaddy),问题应该是:

有没有更好的方法?例如。不需要添加命令和重新编译来获取单个宏的值

【问题讨论】:

  • 这似乎太明显了:NSLog("DEBUG = %d", DEBUG);.
  • @rmaddy 感谢您的快速回复。可悲的是,我无法编译您的命令(使用 Xcode 6 + iOS SDK 8.1)。更重要的是,最好不需要添加命令并再次编译来记录每个宏。
  • 为什么不能编译?什么错误?
  • 哦,知道原因了,应该是NSLog(@"DEBUG = %d", DEBUG); :)
  • 糟糕 - 我在输入时忘记了 @

标签: ios xcode debugging logging


【解决方案1】:

由于提到了“特定于运行时版本”,这个问题似乎有点令人困惑。预处理器宏是编译时设置而不是运行时设置。

如果您只需要找到 Xcode 6 的 iOS 预定义 宏,请在终端中输入:

llvm-gcc -arch armv7 -dM -E – < /dev/null | sort

(是的,它本身只有一个破折号。) 根据需要将 -arch 选项更改为“armv6”或“armv7”或“armv7s”。

这可能可以扩展为预处理您的项目代码并显示所有预处理器宏。但这将是编译时操作而不是运行时操作。

要在运行时打印自定义宏的值,需要专门为每个宏编写至少一些代码。宏是棘手的事情。它们可能被#defined 为一个值或另一个值,或者根本没有#defined。它们也可能是 #defined 为数字,或 #defined 为文本,或对象字面量,如 NSString、NSDictionary 或 NSNumber 或任何类型的对象指针。

如果您确实需要在运行时将内容打印出来,C 标准“stringification operator”('#')可能会很有趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2012-03-11
    • 1970-01-01
    • 2011-12-12
    • 2017-04-04
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多