C中的宏内宏

时间:2016-05-10 17:53:59

标签: c function macros

请帮我解决这个问题。这是在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个错误。

2 个答案:

答案 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)Recommended C Style and Coding Standards (Macros)

     

2)GCC Manual - Standard Predefined Macros

希望它有帮助!

答案 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)