c++ - 在 C 中创建 cout 函数?

标签 c++ c operator-overloading cout

我假设大多数 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/

相关文章:

c++ - 重载运算符+ (C++)

c++ - 在返回类型上重载 operator[]

c++ - 下面的程序在 C++ 中如何工作?

c++ - STL lower_bound 不符合规范

python - Linux eventfd 的初始值和在 pollable Lock 中的使用

qt - 无法使用 QDataStream 将 Qlist 写入文件

c++ - 将整数解释为字节数组的安全性

c - MPI_CART_CREATE 期间参数

c - Malloc 和免费 : memory being freed was not allocated

c++ - C++ 类模板中的友元比较和关系运算符