我假设大多数C++编译器都是用汇编语言编写的.这使得他们完全不同的语言(我可能是错的).话虽如此,如果我要cout
为普通的旧C 创建一个样式函数,我该怎么做?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语言执行此操作的单一方法.
考虑这一点可能有助于在"<<"运算符语法和"operator <<"函数语法之间进行转换.您的C++示例等同于此C++代码:
operator<< ( operator<< (cout, "Hello World!"), endl);
你应该注意的第一件事是cout中根本没有很多聪明.聪明的是运算符<< function - 具体来说,运算符<< function的一个版本,它接受一个流对象(这是cout是什么,但许多其他东西也是如此)作为它的第一个参数.或者,更准确地说,运算符<<函数的范围将流对象作为第一个参数,并将特定的东西作为第二个参数 - 每个类型的对象都有一个可以放入cout流的对象.你也可以看到该语法中的一个C++技巧; 操作符<< stream on streams对象的函数总是返回它们被赋予的流对象,从而允许链接这种性质.
为了将C++代码放入期望类C函数语法的链接器和系统ABI中,大多数C++编译器"破坏"函数名称,以便在其中编码它们具有的参数类型.(当然,"<<"也不是一个有效的类C函数名.)所以,如果你看一下这个函数的生成程序集,你会看到这两个函数的名字是彼此不同 - 它们有后缀表示参数类型.您可以手动执行以下操作:
operator_lshift__stream__endl( operator_lshift__stream__string(cout, "Hello World!"), endl);
在那里你有一些你可以用C实现的东西.
这是正确的,因为C没有运算符重载,你不能改变<<运算符的行为,它总会做一点移位,所以没有办法用C++中的精确语义写'cout', C.
出于兴趣,g ++(GNU C++编译器)主要用C语言编写.