Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
stdio.c和stdio.h之间有什么区别?_C - Fatal编程技术网

stdio.c和stdio.h之间有什么区别?

stdio.c和stdio.h之间有什么区别?,c,C,如果不使用.c文件,无法在头文件中定义stdio函数和变量 如果不是,那么.c文件的用途是什么 必须实现头文件中定义的功能。.c文件包含实现,尽管这些实现已经编译到编译器可以使用的静态或共享库中 头文件应该包含函数的最小描述,以节省编译时的时间。如果它包含整个源代码,那么每次编译时都会强制编译器重新编译它,这是非常浪费的,因为源代码从未更改 实际上,头文件充当如何与已编译库交互的备忘单 提供.c文件的原因主要是为了调试,因此调试器可以在调试构建中逐步执行,并向您显示源代码而不是原始机器代码。在极

如果不使用.c文件,无法在头文件中定义stdio函数和变量


如果不是,那么.c文件的用途是什么

必须实现头文件中定义的功能。
.c
文件包含实现,尽管这些实现已经编译到编译器可以使用的静态或共享库中

头文件应该包含函数的最小描述,以节省编译时的时间。如果它包含整个源代码,那么每次编译时都会强制编译器重新编译它,这是非常浪费的,因为源代码从未更改

实际上,头文件充当如何与已编译库交互的备忘单

提供
.c
文件的原因主要是为了调试,因此调试器可以在调试构建中逐步执行,并向您显示源代码而不是原始机器代码。在极少数情况下,您可能希望查看特定函数的实现,以便更好地理解它,或者在更罕见的情况下,识别错误。它们实际上并不用于编译您的程序


在您的代码中,您应该只通过
#include
指令引用头文件版本
.h

有些语言,如果您想使用其他人编写的内容,您可以说

import module
这就解决了一切问题

C不是这些语言中的一种

您可以将“库”源代码放在一个文件中,然后使用
#include
将其拉入需要的任何位置。但这根本行不通,原因有二:

  • 如果您使用
    #include
    从两个不同的源文件将其拉入,然后将两个生成的对象文件链接在一起,“库”中的所有内容都将定义两次

  • 您可能不想将“库”代码作为源代码交付;您可能更喜欢以编译的对象形式交付它


  • stdio.h
    是一个标准头文件,需要由每个符合标准的托管C实现提供。它声明但不定义许多实体,主要是库函数,如
    putchar
    scanf

    stdio.c
    ,如果它存在,很可能是一个c源文件,它定义了
    stdio.h
    中声明的函数。不要求实现必须使其可用。它甚至可能不存在;例如,
    stdio.h
    中声明的函数的实现可能出现在多个
    *.c
    文件中

    putchar
    的声明是:

    int putchar(int c);
    
    这就是编译器在程序中看到对
    putchar
    的调用时需要知道的全部内容。实现
    putchar
    的代码通常作为机器代码提供,链接器的工作是解析
    putchar()
    调用,以便最终调用该代码
    putchar()
    甚至可能不是用C编写的(尽管可能是这样)


    可以从多个
    *.c
    源文件构建可执行程序。整个程序只需要一个实现
    putchar
    的代码副本。如果
    putchar
    的实现在头文件中,那么它将包含在每个单独编译的源文件中,这会产生冲突,最多也会浪费空间。实现
    putchar()
    (以及库中的所有其他函数)的代码只需编译一次。

    对于任何目的,
    .c
    文件都有特定的功能。例如,
    stdio.c
    文件具有标准的输入输出函数,可在c程序中使用。在
    stdio.h
    头文件中,所有
    stdio.c
    函数、所有定义、所有宏等都有函数原型。当
    包含在主
    code.c
    文件中时,主代码假定存在“
    int printf(const char*format,…)
    ”函数。返回
    int
    值,您可以传递参数。。。。。等等。当您调用
    printf()
    函数时,实际上您使用的是
    stdio.c
    文件。

    (回答者注意:这可能是前面问题的延续。)您知道编译(相对于解释)语言是什么吗?@SteveSummit是的我问的原因是,很明显,关于C的独立编译模型有些东西你不了解,但我不知道它是什么。如果函数和变量存在于.C文件中,为什么要首先使用.h文件?C是几十年前创建的,当时计算机时间很昂贵。它的许多规则,比如在使用函数之前必须声明函数,都是为了加快编译过程而设计的。现代语言通常没有这些限制,因为程序员不太在乎代码是在100毫秒还是300毫秒内编译的。但是回到70年代,1分钟或3分钟是一个更大的问题。一个
    .h
    文件可以让编译器快速理解如何使用代码,而不必编译它。这在组装最终可执行文件时节省了大量时间。如果每次都要重新编译所有内容,即使对代码进行最微小的更改,也需要从头开始构建整个宇宙。如果说C使用头文件来声明将要使用/可能使用的函数和变量以及定义它们的.C文件,是否正确?Turbo Pascal就是最好的例子之一,模块是其中的一流功能语言和编译时间都非常快。C虽然离它不远,但一旦运行它就会快得多,这就是为什么人们使用C而不是Pascal。好消息是C++最终会得到模块,所以编译时间可能会相应地提高一堆。@ TADMAN:不仅仅是“模块作为语言特征”。在这里提到的要点中,C/C++编译器并没有转向