Objective c ';VA#u ARGS';,宏Obj-C中的预处理令牌无效
我使用以下技术来管理我的日志。我将日志打印到Objective c ';VA#u ARGS';,宏Obj-C中的预处理令牌无效,objective-c,Objective C,我使用以下技术来管理我的日志。我将日志打印到asl_log和之前,关于标记[DebugManager shared]isDebugging我想将日志行发送到其他类(方法addLogEvent) 我用\uu AF\u MAKE\u log\u函数(级别,名称)映射日志级别,我需要调用日志(\uu PRETTY\u函数,格式,\u35; VA\u参数)\来自内联无效名称(NSString*格式,…) 我得到一个错误: 如何获取、\uu VA\u ARGS\uuuuuuu和\uuuu PRETTY\u
asl_log
和之前,关于标记[DebugManager shared]isDebugging
我想将日志行发送到其他类(方法addLogEvent
)
我用\uu AF\u MAKE\u log\u函数(级别,名称)
映射日志级别,我需要调用日志(\uu PRETTY\u函数,格式,\u35; VA\u参数)\代码>来自内联无效名称(NSString*格式,…)
我得到一个错误:
如何获取、\uu VA\u ARGS\uuuuuuu
和\uuuu PRETTY\u FUNCTION\uuuuuuuu
?此行:
TheLog(__PRETTY_FUNCTION__,format,##__VA_ARGS__);\
是此宏定义的一部分:
#define __AF_MAKE_LOG_FUNCTION(LEVEL, NAME) \
请注意,该宏不接受变量参数列表。因此,在其定义中没有定义\uu VA\u ARGS\uu
由\uu AF\u MAKE\u LOG\u函数的实例化定义的函数
,内联void NAME()
-采用变量参数列表的事实是不相关的。如果该函数希望将变量参数列表传递给另一个函数,则需要使用标准格式功能,就像它对-[NSString initWithFormat:arguments://code>所做的那样,但这不适用于日志
宏,因为它不是为接受变量列表而设计的
你不能做你想做的事。您的日志
宏与您试图使用它的方式不兼容。您需要设计一个替代版本,例如:
#define TheLogv(fmt, args) { \
if ([[DebugManager shared] isDebugging]) \
addLogEventv(__PRETTY_FUNCTION__,fmt,args); \
}
请注意,这反过来需要存在一个函数addLogEventv()
,该函数接受va_列表而不是实际的变量参数列表。在由\uuu AF\u MAKE\u LOG\u函数定义的函数体中,您必须启动和结束列表两次,每次将列表传递给另一个函数时都要启动和结束一次,因为每个函数都会“消耗”它:
您还可以将TheLog()
宏更改为采用NSString*
,只需传入已创建的formattedString
。关于调用TheLogv(\uu PRETTY\u函数,格式,参数列表);\
您传递\uuuuu PRETTY\u FUNCTION\uuuuu
并在只接收2个argumnet的logv(fmt,args)
中使用它,也从内联void NAME调用\uuuuu PRETTY\u FUNCTION\uuuuu
中调用PRETTY\uu函数
是没有意义的,因为它将采用错误的方法StringYes,您的TheLog()都是正确的
宏或我对它的修改接受函数名作为第一个参数。而\uuuu PRETTY\u FUNCTION\uuuuuuu
将始终是由\uu AF\u MAKE\u LOG\u FUNCTION()
创建的日志函数的名称(例如AFLogError
),而不是调用它的函数。这些都是你最初问题中我没有解决的问题。我解决了您引用的特定编译器错误。如果您想要调用函数的名称AFLogError()
,您需要在一个附加的宏层中封装这些内容。感谢您的努力,我只需要这个答案来澄清
#define __AF_MAKE_LOG_FUNCTION(LEVEL, NAME) \
#define TheLogv(fmt, args) { \
if ([[DebugManager shared] isDebugging]) \
addLogEventv(__PRETTY_FUNCTION__,fmt,args); \
}
#define __AF_MAKE_LOG_FUNCTION(LEVEL, NAME) \
inline void NAME(NSString *format, ...)\
{ \
va_list arg_list; \
va_start(arg_list, format); \
TheLogv(__PRETTY_FUNCTION__,format,arg_list);\
va_end(arg_list); \
va_start(arg_list, format); \
NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arg_list]; \
asl_add_log_file(NULL, STDERR_FILENO); \
asl_log(NULL, NULL, (LEVEL), "PREFIX: %s", [formattedString UTF8String]); \
va_end(arg_list); \
}