用定义替换std :: cout

时间:2014-01-20 11:29:41

标签: c++ c-preprocessor cout

我尝试强制我的编译器用某些东西替换代码中的任何std::cout次出现。 但是当我写这样的东西时:

#define std::cout (*some code*)

我的编译器吐在我的脸上。有没有办法做到这一点?

编辑:

以下是代码段:

# define std::cout (std_out << std::cout)

(std_out是我之前打开的文件)

和带有std :: out occurence

的行上的错误
  

全球范围没有“cout”

3 个答案:

答案 0 :(得分:5)

您定义标识符,而不是任意表达式。 std是 标识符;你的define会导致编译器被替换 标识符std的每个实例都带有::cout (*some code*)。所以编译器不喜欢这并不奇怪 它:std::cout << toto变为::cout (*some code*)::cout << totostd::vector变为::cout (*some code*)::vector

如果你要解释你实际想要实现的目标,我们可能会帮助你做得更好。

答案 1 :(得分:0)

您可以创建自己的cout版本,实际上调用cout,您可以在那里放置任何自定义代码:

std::ostream& my_cout() {
   /// ...
   return std::cout << "a custom message";
}

int main() {
   my_cout() << " hi" << std::endl;
}

答案 2 :(得分:0)

  

我尝试强制我的编译器用

替换代码中的任何std :: cout出现

这是一个坏主意。如果您要在输出流中查找可配置的行为,请将代码中std::cout的所有匹配项替换为out,并将out声明为std::ostream& out(=您输入的任何流类型可能需要)。

  

我的编译器吐在我的脸上。有没有办法做到这一点?

不是这样的。不,你可以写:

#define OUTPUT std::cout

OUTPUT << "a = " << a << std::endl;

但是你需要#define来禁用(或重定向)你的输出流是一个糟糕设计的标志(即你的定义不是你应该尝试解决的问题)。