我假设大多数 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 实际上并没有太多的聪明之处。聪明的是 operator<< 函数——具体来说,operator<< 函数的版本将流对象(这就是 cout,但许多其他东西也是)作为其第一个参数。或者,更准确地说,是将流对象作为第一个参数并将特定事物作为第二个参数的 operator<< 函数的范围——可以放入 cout 流的每种类型的对象都有一个。您也可以在该语法中看到 C++ 技巧之一;流对象上的 operator<< 函数总是返回给定的流对象,从而允许这种性质的链接。
为了将 C++ 代码放入链接器和系统 ABI 中,这些链接器和系统 ABI 需要类似 C 的函数语法,大多数 C++ 编译器会“破坏”函数名称,以便在其中编码它们具有的参数类型。 (此外,当然,“<<”不是有效的类 C 函数名称。)因此,如果您查看为这个函数生成的程序集,您会发现这两个函数的名称是彼此不同——它们有表示参数类型的后缀。您可以手动执行类似的操作:
operator_lshift__stream__endl(
operator_lshift__stream__string(cout, "Hello World!"), endl);
你已经得到了可以用 C 实现的东西。
关于c++ - 在 C 中创建 cout 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1253110/