请帮我解决这个问题。这是获取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;
}

输出:

请找到宏扩展。宏中的最后一个参数(函数返回值)丢失。
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个错误。

最佳答案

当您使用, ...时,这意味着您必须提供一个参数,而不是您的情况。您可以通过命名参数列表来修改宏,并在需要时让预处理器忽略逗号:

#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)

关于c - C中的宏内的宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37145693/

10-16 03:19