用cout<<“字符串”<替换cout<<<“string”

时间:2013-09-30 20:56:31

标签: c++ c-preprocessor

我想用程序替换程序中出现的每个coutendl 连接。我正在尝试使用宏,但无法弄清楚如何做到这一点。请帮忙!

有没有办法在程序中编写完整的行,只是用<< endl连接它? 请注意,如果endl已由程序员编写,则不会连接endl

如果有其他更好的方法,请建议。

4 个答案:

答案 0 :(得分:9)

只需制作一个功能模板:

template<typename T>
void printLn(T const & v, std::ostream & os = std::cout)
{
    os << v << std::endl;
}

如果您想使用它并允许多个参数,并且C ++ 11可供您使用:

void printLn(std::ostream & os)
{
    os << std::endl;
}

template<typename T, typename... Args>
void printLn(std::ostream & os, T const & v, Args&&... args)
{
    os << v;
    printLn(os, std::forward<Args>(args)...);
}

答案 1 :(得分:2)

不幸的是,这是可能的。但我绝不能宽恕它。

#include <iostream>

namespace std
{
class not_actually_cout{};

template<typename T>
not_actually_cout& operator<< (not_actually_cout& stream, const T & v)
{
    std::cout << v << std::endl;
    return stream;
}

not_actually_cout not_actually_cout_instance;
}

#define cout not_actually_cout_instance

int main(void)
{
    cout << "why god why";
    cout << "please no";
    return 0;
}

输出:

why god why
please no

答案 2 :(得分:1)

你真正感兴趣的是什么?每次输出操作或刷新后的换行符?请注意,同花顺非常昂贵。

在每次输出操作后注入flush的最简单方法是设置标志std::ios_base::unitbuf(这是std::cerr的默认设置):

std::cout << std::unitbuf;

在此操作之后,您将在每次单独输出操作后获得刷新,例如

std::cout << "hello" << ' ' << "world\n";

会导致三次冲洗。要自动同时插入换行符,您可以设置一个过滤流缓冲区,在刷新流时添加换行符(可选地,如果没有换行符)。除了设置overflow()之外,这相当于覆盖sync()的{​​{1}}和std::streambuf函数,并将相应的流缓冲区安装到std::cout。通过这些更改,不需要更改源。

下面的代码演示了相应的过滤流缓冲区:

std::unitbuf

根据评论,我意识到这可能不是你想要的,但我不知道只是使用预处理器和/或编译器添加换行符的便携式技术。

答案 3 :(得分:0)

尝试使用正则表达式。所有现代语言都支持它们。

另外,例如,如果您的程序不是那么大,您可以尝试使用SublimeText编辑器。它有非常智能的替换工具,支持正则表达式。