请帮我解决这个问题.这是在C中获取行号,文件名和var args的示例代码.当我尝试运行它时,我遇到了一些错误.我相信有很多方法可以做到这一点.但我必须使用现有代码来实现某些功能.任何帮助或建议将不胜感激.
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#define MY_MACRO1(fmt, args...) \
{ \
char buf_d[1024]; \
MY_MACRO2(__FILE__, __LINE__,call_func(buf_d,sizeof(buf_d),fmt,##args)); \
}
#define MY_MACRO2(__FILE__, __LINE__,fmt, ...) printf("%s : %d -> %s : \n",__FILE__, __LINE__, __VA_ARGS__);
char * call_func(char *buf_t, size_t size, const char *fmt, ...)
{
va_list ap;
va_start(ap,fmt);
vsnprintf(buf_t, size, fmt, ap);
va_end(ap);
return buf_t;
}
int main()
{
printf("\n Now I am printintg macro....\n");
MY_MACRO1("Macro is working fine..\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
请找宏扩展.缺少宏(func返回值)中的最后一个参数.
char buf_d[1024];
printf("%s : %d -> %s : \n","file.c",35, );;
Run Code Online (Sandbox Code Playgroud)
错误:
file.c:35:83: error: expected expression
{ char buf_d[1024]; printf("%s : %d -> %s : \n","file.c", 35, );; };
^
Run Code Online (Sandbox Code Playgroud)
生成1个错误.
当您使用时, ...
,这意味着您必须提供一个参数,但这不是您的情况。您可以通过命名参数列表来修改宏,并让预处理器在需要时避开逗号:
#define MY_MACRO1(fmt, args...) \
{ \
char buf_d[1024]; \
MY_MACRO2(__FILE__, __LINE__,call_func(buf_d,sizeof(buf_d),fmt,##args)); \
}
#define MY_MACRO2(F,L,fmt,args...) printf("%s : %d -> %s : \n",F, L, fmt, ##args)
Run Code Online (Sandbox Code Playgroud)