请帮我解决这个问题。这是在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;
}
输出:
请找宏扩展。缺少宏(func返回值)中的最后一个参数。
char buf_d[1024];
printf("%s : %d -> %s : \n","file.c",35, );;
错误:
file.c:35:83: error: expected expression
{ char buf_d[1024]; printf("%s : %d -> %s : \n","file.c", 35, );; };
^
生成1个错误。
答案 0 :(得分:2)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#define DEBUG_MSG( _msg, ... ) do {print_debug_msg( __FILE__, __LINE__, __FUNCTION__, _msg, ## __VA_ARGS__ ); }while(0)
void print_debug_msg( const char * module, int line, const char * func, const char * fmt, ... )
{
va_list va;
char buf[ 1024 ] = {0};
va_start( va, fmt );
vsnprintf( buf, sizeof(buf), fmt, va );
va_end( va );
printf( "%s:%d - %s() - %s\n", module, line, func, buf );
}
int myfunc( const char * msg )
{
DEBUG_MSG( "Message: %s", msg );
return 0;
}
int main( int argc, char * argv[] )
{
DEBUG_MSG("The quick brown fox jumps over the lazy dog.");
DEBUG_MSG("Pack my box with five dozen liquor jugs.");
myfunc( "How vexingly quick daft zebras jump" );
myfunc("The five boxing wizards jump quickly.");
return 0;
}
/* eof */
编译:
$ gcc -Wall macro.c -o macro
测试:
$ ./macro
macro.c:32 - main() - The quick brown fox jumps over the lazy dog.
macro.c:34 - main() - Pack my box with five dozen liquor jugs.
macro.c:24 - myfunc() - Message: How vexingly quick daft zebras jump
macro.c:24 - myfunc() - Message: The five boxing wizards jump quickly.
参考文献:
希望它有帮助!
答案 1 :(得分: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)