C 预处理器宏内部的字符串处理
我需要更改宏的实现(LOGGING_Macro) printf到syslog中 宏用法:C 预处理器宏内部的字符串处理,c,string,parameter-passing,c-preprocessor,stringification,C,String,Parameter Passing,C Preprocessor,Stringification,我需要更改宏的实现(LOGGING_Macro) printf到syslog中 宏用法: LOGGING_MACRO(5,("Value of x,y=%d,%d\n",x,y)); #define LOGGING_MACRO(loglevel,str) printf str; #define LOGGING_MACRO(loglevel,str) syslog(loglevel,str); Def1: LOGGING_MACRO(5,("Value of x,y=%d,%d\n",x,y
LOGGING_MACRO(5,("Value of x,y=%d,%d\n",x,y));
#define LOGGING_MACRO(loglevel,str) printf str;
#define LOGGING_MACRO(loglevel,str) syslog(loglevel,str);
Def1:
LOGGING_MACRO(5,("Value of x,y=%d,%d\n",x,y));
#define LOGGING_MACRO(loglevel,str) printf str;
#define LOGGING_MACRO(loglevel,str) syslog(loglevel,str);
Def2:
LOGGING_MACRO(5,("Value of x,y=%d,%d\n",x,y));
#define LOGGING_MACRO(loglevel,str) printf str;
#define LOGGING_MACRO(loglevel,str) syslog(loglevel,str);
注意:我无法更改宏格式:(
Def2抛出错误,因为syslog将不接受带有前后大括号的“str”(第二个参数)。[但在带有printf的Def1中工作正常]
在将“str”传递给syslog之前,请建议如何从宏中的“str”中删除第一个和最后一个大括号。下面的示例适用于单线程应用程序:
char* custom_log(const char *fmt, ...) {
static char outputString[200]; //Adjust your size for maximal log value
va_list args;
va_start(args, fmt);
vsprintf(outputString, fmt, args);
va_end(args);
return outputString;
}
然后将宏修改为:
#define LOGGING_MACRO(loglevel,str) syslog(loglevel, custom_log str)
请记住,这仅在单线程模式下有效,并确保在调用自定义日志函数的地方,custom\u log
函数可见
对于多线程,您可以这样更新它:
#define LOGGING_MACRO(loglevel,str) do {\
mutex_lock(); /*Lock your mutex for debug print*/ \
syslog(loglevel, custom_log str); /*Debug*/ \
mutex_unlock(); /*Unlock mutex*/ \
} while (0)
请记住,您必须编写
mutex\u lock
和mutex\u unlock
函数,以满足您在系统中只锁定多线程之间的调试函数的要求。给出一个如何调用宏的示例,因为这种方法printf str;
完全失败。@tilz0R,在本节中给出“宏用法:”你好,DYZ。调用宏时会传递参数。这不可能是您直接要求的,但如果您使用局部变量,则可以完成。编辑:不,它不能。您的用法失败。是否有其他方法可以在宏中编辑'str'的内容???while循环是什么?是的。工作正常。谢谢。