C 预处理器宏内部的字符串处理

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) 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));
#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循环是什么?是的。工作正常。谢谢。