gpt4 book ai didi

c++ - 在 "test mode"中打印信息,但不在 "normal execution"中打印信息

转载 作者:可可西里 更新时间:2023-11-01 18:42:34 28 4
gpt4 key购买 nike

我正在使用 c++ 中的应用程序,它使用特殊的 dprintf 函数来打印信息,这是一个示例:

dprintf(verbose, "The value is: %d", i);

我正在做的是,当我出于测试目的定义冗长然后打印信息时,当我在正常执行中工作时我没有定义它并且我没有在屏幕上看到无用的信息。我的问题是如何执行该功能或实现相同的想法?

最佳答案

我尽量避免使用 var-arg C 风格的函数,主要原因有两个:

  • 它们不是类型安全的,不能使用运算符<<
  • 他们无法识别何时提供的论点太少或太多

我创建了一种使用 boost::fusion 的方法,它以类型安全的方式提供参数。它遍历这些参数,在遇到 % 时将它们打印出来。如果给出的参数太少或太多,都会抛出异常。

仍然存在一个问题:Variadic 宏在 C++ 中还不是标准的。所以,我做了两个版本。一个与当前 C++ 一起工作的。您必须使用

调用它
dprintf("name: %, value: %\n", ("foo", 42));

然后。另一个版本使用可变参数宏,可以通过定义预处理器符号来使用,这使您可以编写

dprintf("name: %, value: %\n", "foo", 42);

这是代码。 boost.fusion为此提供了更多详细信息:

#include <boost/fusion/include/sequence.hpp>
#include <boost/fusion/include/make_vector.hpp>
#include <boost/fusion/include/next.hpp>
#include <stdexcept>
#include <iostream>

template<typename IterS, typename IterSeqE>
void print_vec(IterS b, IterS e, IterSeqE, IterSeqE) {
while(b != e) {
if(*b == '%') {
if(++b != e && *b == '%') {
std::cout << '%';
} else {
throw std::invalid_argument("too many '%'");
}
} else {
std::cout << *b;
}
++b;
}
}

template<typename IterS, typename IterSeqB, typename IterSeqE>
void print_vec(IterS b, IterS e, IterSeqB seqb, IterSeqE seqe) {
while(b != e) {
if(*b == '%') {
if(++b != e && *b == '%') {
std::cout << '%';
} else {
std::cout << *seqb;
return print_vec(b, e, next(seqb), seqe);
}
} else {
std::cout << *b;
}
++b;
}
throw std::invalid_argument("too few '%'");
}

template<typename Seq>
void print_vec(std::string const& msg, Seq const& seq) {
print_vec(msg.begin(), msg.end(), begin(seq), end(seq));
}

#ifdef USE_VARIADIC_MACRO
# ifdef DEBUG
# define dprintf(format, ...) \
print_vec(format, boost::fusion::make_vector(__VA_ARGS__))
# else
# define dprintf(format, ...)
# endif
#else
# ifdef DEBUG
# define dprintf(format, args) \
print_vec(format, boost::fusion::make_vector args)
# else
# define dprintf(format, args)
# endif
#endif

// test, using the compatible version.
int main() {
dprintf("hello %, i'm % years old\n", ("litb", 22));
}

关于c++ - 在 "test mode"中打印信息,但不在 "normal execution"中打印信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/455904/

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