在“测试模式”中打印信息但不在“正常执行” [英] Print information in "test mode" but not in "normal execution"

查看:102
本文介绍了在“测试模式”中打印信息但不在“正常执行”的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using an application in c++ that uses a special dprintf function to print information, this is an example:

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

做什么是当我定义verbose为测试目的,然后打印信息,在正常执行我不定义它,我没有看到无用的信息在屏幕上。我的问题是我如何做这个功能或实现相同的想法。

What is doing is when I define verbose for test purposes then I print the information and when I am working in normal execution I do not define it and I do not see useless information in the screen. My question is how can I do that function or implement the same idea?.

推荐答案

我尽量避免使用var-arg - 两种主要原因:

I try to avoid using var-arg c-style functions for two main reasons:


  • 它们不是类型安全的,不能使用运算符<<

  • 当提供的参数太少或太多时,他们无法识别

使用 boost :: fusion ,它以类型安全的方式提供参数。它迭代这些参数,当遇到时打印出来。如果给定的参数太少或太多,则抛出异常。

I've made a way that works using boost::fusion, which is given arguments in a type-safe way. It iterates over those arguments, printing out them when a % is encountered. If too few or too many arguments were given, an exception is thrown.

仍有一个问题:Variadic宏在C ++中尚未标准化。所以,我做了两个版本。一个工作与当前的C ++。您必须使用

There is one problem still: Variadic macros are not yet standard in C++. So, i have made two versions. One that work with current C++. You have to invoke it using

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

然后。使用可变宏的另一个版本可以通过定义一个预处理符号来使用,该符号可以让你写

Then. The other version, using variadic macros, can be used by defining a preprocessor symbol, which enables you to write

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

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

Here is the code. The boost.fusion provides more details for this:

#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));
}

这篇关于在“测试模式”中打印信息但不在“正常执行”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆