我假设大多数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语言做的单一方法。
答案 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)