如何理解stdio.h在不同操作系统上的不同
首先,我说的是类UNIX系统。
我查看了Mac OS、Linux、Minix和K&RC书中对“FILE”结构体的定义,它们都是不同的。
在K&RC书中,
typedef struct _iobuf{
int cnt;
char *ptr;
char *base;
int flag;
int fd;
} FILE;
在Mac OS上很清楚,它的结构内部有更多的东西。
在 Linux (3.0) 上,
typedef _IO_FILE FILE;
标题显示“在 C++ iostream 之上定义 ISO C stdio”。嗯……? (Linux 上的 C 是由 C++ 实现的?不是应该相反吗?) 看起来 _IO_FILE 定义在
Minix 上的 libio.h 中,定义与 K&R 非常相似。
我的理解是stdio.h应该是C的一部分。第一个C编译器是由汇编语言实现的。 C 应该独立于操作系统类型。
硬件上的机器代码 ->汇编-> C->更复杂的C-> UNIX
现在,不同的操作系统(各种UNIX)上有不同的stdio.h,编译器都是gcc。
这怎么理解呢?
多谢, 阿尔弗雷德
First of all, I am talking about UNIX-like systems.
I look at the definition of the "FILE" struct at Mac OS, Linux, Minix and K&R C book, they are all different.
In K&R C book, it is quite clear
typedef struct _iobuf{
int cnt;
char *ptr;
char *base;
int flag;
int fd;
} FILE;
on Mac OS, it has more stuff inside the struct.
on Linux (3.0), it is
typedef _IO_FILE FILE;
The header says "Define ISO C stdio on top of C++ iostreams." Em... ? ( C on Linux are implemented by C++ ? Shouldn't it be opposite?)
Looks like _IO_FILE definition is in libio.h
on Minix, the definition is quite similar as K&R.
My unstanding was stdio.h should be part of C. The first C compiler is implemented by assembly language. And C should be independent of OS type.
machine code on HW -> asm -> C -> more complicated C -> UNIX
And now, there are different stdio.h on different OSs (all kinds of UNIX) and the compilers are all gcc.
How to understand this?
Thanks a lot,
Alfred
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
FILE
结构与平台相关,其字段由 C 库内部使用。您不应该依赖其中的内容。The
FILE
struct is platform dependent and its fields are used internally by the C library. You shouldn't be relying on what's inside it.您自己的 C 代码不应依赖于操作系统。 C 头文件和内部 CRT 实现依赖于操作系统。跨平台编程的意义:编写代码,在不同的操作系统中编译它,并且它应该工作。然而,底层工具(C、跨平台库)与特定于操作系统的API进行交互,并且它们在不同的操作系统中是不同的。
当然,您不应该使用任何不透明结构的字段,这会破坏平台无关的代码。
Your own C code should not depend on OS. C headers and internal CRT implementation are OS-dependent. The meaning of cross-platform programming: write the code, compile it in different OS, and it should work. However, underlying tools (C, cross-platform libraries) are interacting with OS-specific API and they are different in different OS.
Of course, you should not use any fields of opaque structures, this breaks platform independent code.