当前位置:  开发笔记 > 编程语言 > 正文

使用#ifdefs和#define可选择将函数调用转换为注释

如何解决《使用#ifdefs和#define可选择将函数调用转换为注释》经验,为你挑选了2个好方法。

有可能做这样的事情

#ifdef SOMETHING
#define foo //
#else
#define foo MyFunction
#endif

这个想法是,如果定义了SOMETHING,那么对foo(...)的调用将成为注释(或者不会被评估或编译的内容),否则它将成为对MyFunction的调用.

我见过__noop,但我不相信我可以使用它.

编辑(S):

我不认为我真的可以在这里使用宏,因为MyFunction采用可变数量的参数.

此外,我想这样做,所以参数不被评估!(所以做一些像评论我的MyFunction的主体并没有真正给我我需要的东西,因为参数仍将被评估)



1> ChrisW..:

试试这个:

#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

我在实践中看到这种事情的原因是从发布版本中删除了日志记录功能.但是,另请参阅单独的'debug'和'release'构建?在人们质疑是否应该甚至不同的版本.


或者,Jonathan对此答案的评论建议不要将函数调用重新定义为无效,而是执行如下操作:

#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 编程实践以及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兼容性存在问题,否则新代码不应使用它.



2> MattK..:

也许更简单的方法是有条件地省略函数的主体?

void MyFunction() {
#ifndef SOMETHING
    
#endif
}

除非您特别不希望进行函数调用,否则这似乎是实现目标的一种干净方式.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有