当前位置:  开发笔记 > 编程语言 > 正文

在C中创建一个cout函数?

如何解决《在C中创建一个cout函数?》经验,为你挑选了2个好方法。

我假设大多数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语言执行此操作的单一方法.



1> Brooks Moses..:

考虑这一点可能有助于在"<<"运算符语法和"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实现的东西.



2> David Clarid..:

这是正确的,因为C没有运算符重载,你不能改变<<运算符的行为,它总会做一点移位,所以没有办法用C++中的精确语义写'cout', C.

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

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有