【问题标题】:Macro defination in ios custom framework is not workingios自定义框架中的宏定义不起作用
【发布时间】:2013-11-27 19:13:50
【问题描述】:

在ios中构建框架时,任何人都可以通过打印一些信息到控制台来告诉如何使用debuglog之类的宏,并且当应用程序开发人员在调试模式下使用该框架运行应用程序时,它应该可以工作。

【问题讨论】:

  • 你在混淆概念。如果您需要针对某些条件的警告(例如您没有在构建行上定义某些内容),您可以在构建项目时看到“#pragma warning msg”。如果您希望开发人员使用您的库来获取日志消息,您必须编写自己的小“日志”功能,它应该将文本输出到“标准错误”。显然,您可以编写一个最终使用 fprintf(stderr, C-Format-String, args...); 的宏
  • 嗨,大卫,我没有混淆概念,我只是想问有没有办法做到这一点,你能否解释清楚 fprintf 你在说什么,我该如何使用它。提前致谢。

标签: ios debugging macros frameworks


【解决方案1】:

1) 在你的库中用一些奇怪的名字定义一个全局 BOOL:

BOOL GzRkYr22; // (use your framework name as prefix or suffix)

2) 为您的用户提供一些打开或关闭标志的方法:

- (void)enabledDebuggingMessages:(BOOL)val;

该方法将设置全局标志。

3) 将其放入您的 .pch 文件中

extern BOOL GzRkYr22;

#define Log(format, ...) \
do { if(GzRkYr22 ) NSLog(format, \
## __VA_ARGS__); \
} while(NO)

4) 在代码中添加日志消息:

Log(@"Just did %d operations", someNumber);

5) 如果您后来决定只为库的“调试”版本提供日志消息,但在“生产”版本中完全禁用它们:

#ifndef NDEBUG // some macro that is defined or not defined for the different modes

#define Log(format, ...) \
do { if(GzRkYr22 ) NSLog(format, \
## __VA_ARGS__); \
} while(NO)

#else

#define Log(format, ...)

#endif

【讨论】:

  • @David H 请给我一些关于使用 do while 的更多解释,为什么不只是 if 条件。和 NSLog(format, \## VA_ARGS);这是我需要使用的格式吗?
  • @Reddy do while 是一个古老的技巧,以确保当你放一个 ';'在宏之后,宏扩展为一行代码,并且如果在单个 if 语句中使用它不会出现意外分支 "if(something) MACRO(...);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 2017-01-29
  • 2018-12-10
  • 2022-01-08
相关资源
最近更新 更多