替换C / C ++宏中的左括号字符

时间:2012-02-06 20:22:44

标签: c++ c macros

我需要一个宏来将__FILE____LINE__传递给具有默认参数的函数。这已经打开了一堆蠕虫,因为带有宏的默认args不可能或非常混乱,如果可能的话我需要支持GCC和MSVC:

class Class
{
#ifdef _DEBUG

   int Function(int a, int b = 10, int c = 20) { return a + b + c; }

#else

   int DebugFunction(const char* filename, int lineNo, int a, int b = 10, int c = 20)
   {
      printf("%s (%i) a:%i b:%i c:%i\n", filename, lineNo, a, b, c);
      return a + b + c;
   }

   //Not possible
   #define Function( DebugFunction(__FILE__, __LINE__

#endif
}

我试过\逃避(无济于事。代码库很大,所以修复缺少的默认args或创建多个宏不是一个受欢迎的选项。

任何解决方案?

4 个答案:

答案 0 :(得分:6)

你可以制作一个可变的宏:

#define Function(...) DebugFunction(__FILE__, __LINE__, __VA_ARGS__)

由于你不能“超载”宏,这可能是你最好的选择。

答案 1 :(得分:3)

一种选择是重写您的主要功能Function,如下所示:

int Function(const char* filename, int lineNo, int a, int b = 10, int c = 20)
{
   #ifdef _DEBUG
       printf("%s (%i) a:%i b:%i c:%i\n", filename, lineNo, a, b, c);
   #endif
   return a + b + c;
}

这样,所有调用都转到同一个函数,但该函数的行为取决于你是否设置了_DEBUG标志。这绕过了默认参数的问题,因为你只需要一个带有条件代码包含的普通函数调用,而不是一个可能需要很多参数的宏。

希望这有帮助!

答案 2 :(得分:1)

我不太清楚我明白你要做什么,但是variadic macro会不会这样做?

答案 3 :(得分:1)

不是一个很大的c ++人,但是你尝试了类似的东西(伪代码)

#ifdef debug

#define Function(args) _Function(__file__, __line__, (args))
int _Function(char *file, int line, args) { /* code */ }

#else

#define Function(args) _Function(args)
int _Function(args) { /* code */ }

#endif

当然,函数本身需要能够采用多个版本的参数;我真的没有看到任何其他方式这样做。