在C中创建一个cout函数?

时间:2009-08-10 04:34:19

标签: c++ c operator-overloading cout

我假设大多数C ++编译器都是用汇编语言编写的。这使得他们完全不同的语言(我可能是错的)。话虽如此,如果我要为普通的旧C创建一个cout样式函数,我该怎么做? cout有一些非常令人印象深刻的功能,例如:

// endl not only prints a new line but also flushes the stream
cout << "Hello World!" << endl;

我非常确定在C中翻译成这个:

printf("Hello World!\n");
fflush(1);                  //stdout = 1

下一步业务,<<运营商。在C ++中,这很容易(运算符重载),但我想不出用C语言做的单一方法。

3 个答案:

答案 0 :(得分:8)

在“&lt;&lt;”之间进行翻译可能会有所帮助。运算符语法和“运算符&lt;&lt;”函数语法。您的C ++示例等同于此C ++代码:

operator<< ( operator<< (cout, "Hello World!"), endl);

你应该注意的第一件事是cout中根本没有很多聪明。聪明的是运营商&lt;&lt;函数 - 具体地说,运算符的版本&lt;&lt;将流对象(也就是cout,但许多其他东西也是如此)作为其第一个参数的函数。或者,更准确地说,操作员的范围&lt;&lt;将流对象作为第一个参数的函数,并将特定的东西作为第二个参数 - 每个类型的对象都有一个可以放入cout流的对象。你也可以看到该语法中的一个C ++技巧;运算符&lt;&lt;流对象上的函数总是返回它们被赋予的流对象,从而允许链接这种性质。

为了将C ++代码放入需要类C函数语法的链接器和系统ABI中,大多数C ++编译器会“破坏”函数名称,以便在其中编码它们具有的参数类型。 (当然,“&lt;&lt;&lt;”不是一个有效的类C函数名。)所以,如果你看一下这个函数的生成程序集,你会看到两个名字的名字。函数彼此不同 - 它们有后缀表示参数类型。您可以手动执行此类操作:

operator_lshift__stream__endl(
  operator_lshift__stream__string(cout, "Hello World!"), endl);

你可以在C中实现一些东西。

答案 1 :(得分:5)

这是正确的,因为C没有运算符重载,你不能改变&lt;&lt;&lt;&lt;&lt;&lt;&lt;运算符,它总是会稍微移位,所以没有办法用C语言中的精确语义来编写'cout',在C中。

出于兴趣,g ++(GNU C ++编译器)主要用C语言编写。

答案 2 :(得分:4)

C实际上是C ++编译器和标准库的一种流行的实现语言(C ++本身也是如此 - 实际上是一种概念,有时被称为自托管或引导语言),你可以研究丰富的整个来源,复杂的C ++标准库(加上扩展名)here(对不起,这是gcc 3 - 找不到一个可以在网上轻松浏览的gcc 4源码树,当然你可以轻松下载这些源码并研究它们在你的本地机器上。)

就我个人而言,我建议先用一本好书开始,比如this one - 一旦掌握了C ++的所有模糊角落和缝隙,这些来源对你来说会更有意义。 iostreams(作为奖励,这本书还带您参观当地的导游 - 抓住你的帽子! - 。)。