对iOS中宏的误解

对iOS中宏的误解,ios,xcode,macros,header-files,Ios,Xcode,Macros,Header Files,有一件事我根本就不明白,因为我一辈子都无法让它发挥作用。我想创建一个扩展NSLog(NSString*format,…)的宏。以下是我的想法: NSLogExtensions.h #define DebugLog(debugMode, format, ...) MyDebugLog(debugMode, [[NSString stringWithFormat:@"<%@> (Line %d): ", NSStringFromClass([self class]), __LINE__]

有一件事我根本就不明白,因为我一辈子都无法让它发挥作用。我想创建一个扩展
NSLog(NSString*format,…)
的宏。以下是我的想法:

NSLogExtensions.h

#define DebugLog(debugMode, format, ...) MyDebugLog(debugMode, [[NSString stringWithFormat:@"<%@> (Line %d): ", NSStringFromClass([self class]), __LINE__] stringByAppendingString:format], ##__VA_ARGS__)

@interface NSLogExtensions : NSObject

@end
我希望能够包括NSLogExtensions头文件,然后能够使用宏,但我仍然收到GCC隐式函数声明警告。

签出此答案

它有很多关于如何在扩展的NSLogs中使用宏的详细信息

检查这个答案


它有很多关于如何为扩展NSLog使用宏的详细信息,
DebugLog
宏使用函数
MyDebugLog
,因此您必须添加原型

void MyDebugLog(bool debugMode, NSString *format, ...);
到NSLogExtensions.h。然后它在没有警告的情况下编译


但是与@Calvinbai所指的解决方案相比,您的解决方案有一个(我认为)很大的缺点:即使您通过将
debugMode
设置为
false
来关闭日志记录,
DebugLog
宏将评估所有参数并调用
MyDebugLog
。对于其他解决方案,如果禁用日志记录,预处理器将删除所有内容。

宏使用函数
MyDebugLog
,因此必须添加原型

void MyDebugLog(bool debugMode, NSString *format, ...);
到NSLogExtensions.h。然后它在没有警告的情况下编译


但是与@Calvinbai所指的解决方案相比,您的解决方案有一个(我认为)很大的缺点:即使您通过将
debugMode
设置为
false
来关闭日志记录,
DebugLog
宏将评估所有参数并调用
MyDebugLog
。对于其他解决方案,如果日志记录被禁用,预处理器将删除所有内容。

您想用它实现什么?关闭基于宏的日志记录?主要目标是能够使用我可以在每个类中指定的布尔值打开和关闭日志记录。我还在每个日志中添加了行号和类名。您想用它实现什么?关闭基于宏的日志记录?主要目标是能够使用我可以在每个类中指定的布尔值打开和关闭日志记录。我还为每个日志添加了行号和类名。我的宏几乎完全相同,但不是使用单个全局宏来启用/禁用日志记录,而是希望将其作为参数传递。我的宏几乎完全相同,但不是使用单个全局宏来启用/禁用日志记录,我想把它作为一个参数传递,如果我担心在我的生产代码中有日志,我可能还会添加一个全局标志。但现在我只想控制项目的哪个部分在何时打印调试代码。谢谢你的帮助!如果我担心生产代码中有日志,我可能还会添加一个全局标志。但现在我只想控制项目的哪个部分在何时打印调试代码。谢谢你的帮助!