2013-11-27 96 views
1

可以请任何人告诉如何使用像调试日志这样的宏,通过在ios中构建框架时向控制台输出一些信息,当应用程序开发人员使用此框架运行应用程序时它应该可以工作在调试模式下。在ios自定义框架中的宏定义不起作用

+0

您在混淆概念。如果您需要某些条件的警告(如您未在构建线上定义某些内容),则可以在构建项目时看到'#pragma warning msg'。如果您希望开发人员使用库来获取日志消息,则必须编写自己的“日志”功能,该功能应将文本输出为“std error”。显然,你可以编写一个使用fprintf(stderr,C-Format-String,args ...)结束的宏; –

+0

大卫嗨大卫我没有混淆的概念,我只是问有没有办法这样做,你可以请清楚解释一下fprintf你在说什么,我该如何使用它。提前致谢。 –

回答

1

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

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

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

- (void)enabledDebuggingMessages:(BOOL)val; 

这种方法将设置全局标志。如果以后决定要只对日志消息

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

5):

3)在.PCH文件

extern BOOL GzRkYr22; 

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

4将这个)与日志消息撒上代码一个“调试”版本的库,但完全禁用它们以用于“生产”版本:

#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 
+0

高超的解释,非常感谢。 –

+0

@David H请给我一些关于使用do的更多解释,但为什么不仅如果条件。和NSLog(格式,\ ## __VA_ARGS__);这是我需要使用的格式。 – lreddy

+1

@Reddy做虽然是一个古老的伎俩,以确保当你把';'在宏之后,宏展开为一行代码,并且如果您在单个if语句中使用它,则不会意外分支“if(something)MACRO(...); –