gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:23:30 26 4
gpt4 key购买 nike

有没有可能做这样的事情

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

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

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

编辑:

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

另外,我想让它不评估参数! (因此,像注释掉 MyFunction 的主体之类的操作并不能真正满足我的需要,因为仍然会评估参数)

最佳答案

试试这个:

#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

我在实践中看到这种东西的原因是为了摆脱发布版本中的日志记录功能。但是,另请参阅 Separate 'debug' and 'release' builds?人们在其中质疑您是否应该甚至拥有不同的构建。


或者,乔纳森对此答案的评论建议不要将函数调用重新定义为空,而是建议执行以下操作:

#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 Space Flight Center programming standards .

来自 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 兼容性有问题,否则新代码不应使用它。

关于c++ - 使用 #ifdefs 和 #define 可选择将函数调用转换为注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com