是否可以在不使用任何头文件的情况下在C ++中执行I / O操作?

时间:2016-05-12 13:55:19

标签: c++ io low-level

我只是想知道,C ++中的所有I / O都是通过标准库头文件完成的,这意味着(对于C ++ std libs)输入和输出流或(对于C std libs)意味着标准的输入/输出函数。

我的问题是,是否可以根本不使用这些,并直接与操作系统的stdin和stdout接口?

在C ++中,我没有使用任何标题,我的意思是。

4 个答案:

答案 0 :(得分:3)

unsigned char in(unsigned short port) {
unsigned char rv;
__asm__ __voltaile__ ("inb %1, %0" : "=a" (rv) : "dN" (port));
 return rv;
}
void out(unsigned short port, unsigned char data) {
 __asm__ __voltaile__ ("outb %1, %0" : : "dN" (port) : "a" (data));
} 

它存在...

答案 1 :(得分:2)

我将您的问题读作:我可以在没有#including头文件的情况下访问I / O函数。我看到其他人将其解释为“不包括标准库头文件”

简单的答案是“不”。 I / O不是内置于编译器中的。它由图书馆提供。

更复杂的答案是,您可以直接在.cpp文件中复制必要的头文件的内容,以定义标准库支持(或定义OS支持方法)。这将是一个愚蠢的事情,但它是可能的。

回应评论的历史题外话:

C语言首次出现时,出于多种原因,这是革命性的。语言设计者最重要的选择之一(现在在大多数现代语言中被认为是理所当然的)是编译器及其接受的语言应该尽可能小而不会丢失功能。与当时可用的其他编译器(FORTRAN,COBOL等)相比,这使C编译器变得微不足道

编译器专注于编译(不太好打印源,或......)

语言的重点是让一切尽可能不需要任何东西。如果您正在编写一个操作数字接口上的位的嵌入式程序,则无需为在行式打印机上显示的双精度数字格式付费 - 无论是在编译时还是在运行时。

多年来,C语言设计师的这一决定多次受到质疑,但这一决定始终能够应对挑战。它是当时正确的选择,它仍然是正确的选择 - 它是使C及其后代成为我们丰富的计算环境的大部分其余部分的基础的重要因素。

答案 2 :(得分:1)

当然,您可以在unix系统上执行此操作

#include <unistd.h>

int main(void)
{
    write(1, "Hello world\n", 12);
}
使用操作系统调用的Windows系统上的

或类似内容。

答案 3 :(得分:0)

实际上,这就是Linux内核,或者就其他任何其他操作系统内核而言。只需一行#include就可以编写代码来完成系统任何操作。例如,Linux内核中的kprintf函数就是这样一个函数的一个例子,它没有stl依赖,因为内核是自包含的。

当然,这在用户空间可能无法实现,因为操作系统限制访问与将内容放在屏幕上有关的内存部分。