一行调试宏

时间:2016-07-31 20:25:12

标签: c++ macros

我想创建一个C ++宏函数来调试,我希望它能像这样工作:

int main(){
    int a = 3, b = 5, c = 7;
    string s = "<";

    print(a,s,b);
    print(a,s,b,s,c);
}

OUTPUT:
3 < 5
3 < 5 < 7

我已经阅读了很多关于可变参数宏的内容,但是我尝试编码的任何东西都根本无法工作。

我考虑过使用lambda但没有提出算法来实现它。

我需要它像1行代码,因为它仅用于调试,而且我可以创建更复杂的函数,但我想这一定是可能的......

3 个答案:

答案 0 :(得分:2)

您可以使用可变参数模板而不是MACRO:

template <typename ... Ts>
void print(Ts&&... args)
{
    int dummy[] = {0, ((std::cout << args), 0)...};
    static_cast<void>(dummy); // avoid warning for unused variable
    std::cout << std::endl;
}

或在c ++ 17

template <typename ... Ts>
void print(Ts&&... args)
{
    (std::cout << ... << args) << std::endl;
}

答案 1 :(得分:1)

如果您同意用&#39; _context.Entry(customer).State = EntityState.Modified; _context.Entry(customer.ShippingAddress).State = EntityState.Modified; &#39;替换分隔符。 (而不是&#39; <<&#39;)然后宏很容易定义(请注意,,不是宏的好名称,这就是为什么我适当地重命名):

print

输出:

#include <iostream>
#include <string>

#ifdef DEBUG
#define DEBUG_PRINT(x) std::cout << x << std::endl
#else
#define DEBUG_PRINT(x)
#endif

int main(){
    int a = 3, b = 5, c = 7;
    std::string s = "<";

    std::cout << "START" << std::endl;

    DEBUG_PRINT(a << s << b);
    DEBUG_PRINT(a << s << b << s << c);

    std::cout << "END" << std::endl;
    return 0;
}

答案 2 :(得分:1)

我几乎达到了我想要的效果(使用2行代码):

#define print(args...) {db,args; cerr<<endl;}
struct dbg{template<typename T> dbg& operator , (const T& v){cerr<<v<<" "; return *this; }} db;

现在我可以打印(1,2,&#34; asjd&#34;)并且工作正常