试试这个:
#ifdef SOMETHING
#define foo(x)
#else
#define foo(x) MyFunction(x)
#endif
如果您的函数有多个参数,则:
#ifdef SOMETHING
#define foo(x,y,z)
#else
#define foo(x,y,z) MyFunction(x,y,z)
#endif
如果您的函数具有可变数量的参数,那么您的编译器可能支持所谓的“可变参数宏”,如下所示:
#ifdef SOMETHING
#define foo(...)
#else
#define foo(...) MyFunction(__VA_ARGS__)
#endif
我在实践中看到这种事情的原因是为了摆脱发布版本中的日志记录功能。但是,另请参阅单独的“调试”和“发布”版本?人们质疑你是否应该有不同的构建。
或者,乔纳森对此答案的评论建议不要将函数调用重新定义为空,而是建议执行以下操作:
#ifdef SOMETHING
#define foo(...) do { if (false) MyFunction(__VA_ARGS__) } while (0)
#else
#define foo(...) do { if (true) MyFunction(__VA_ARGS__) } while (0)
#endif
这样做的原因是函数调用总是被编译(所以它不会留下像引用已删除变量这样的无端错误),但只在需要时调用:参见 Kernighan & Pike The Practice of Programming和Goddard航天飞行中心编程标准。
从 debug.h 文件(起源于 1990 年,因此不使用__VA_ARGS__
):
/*
** Usage: TRACE((level, fmt, ...))
** "level" is the debugging level which must be operational for the output
** to appear. "fmt" is a printf format string. "..." is whatever extra
** arguments fmt requires (possibly nothing).
** The non-debug macro means that the code is validated but never called.
** -- See chapter 8 of 'The Practice of Programming', by Kernighan and Pike.
*/
#ifdef DEBUG
#define TRACE(x) db_print x
#else
#define TRACE(x) do { if (0) db_print x; } while (0)
#endif /* DEBUG */
使用 C99,不再需要双括号技巧。除非 C89 兼容性有问题,否则新代码不应使用它。