Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c ';VA#u ARGS';,宏Obj-C中的预处理令牌无效_Objective C - Fatal编程技术网

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); \
}