【问题标题】:Using printf function without actually importing stdio.h and it worked?! Why is that so? [duplicate]使用 printf 函数而不实际导入 stdio.h 并且它有效?!为什么呢? [复制]
【发布时间】:2012-06-22 06:00:10
【问题描述】:

可能重复:
Why #include <stdio.h> is not required to use printf()?

//#include <stdio.h>
//#include <conio.h>

main(){

printf("Hi");
getch();

}

当我编写这个程序时,令我震惊的是,它实际上并没有导入任何包含 printf 函数的 c 库,例如 stdio。为什么呢? (使用Dev-C++ 4.9.9.2,保存为.c,不是.cpp)

【问题讨论】:

    标签: c


    【解决方案1】:

    C 允许您在不首先定义原型的情况下调用函数。 (C++ 不这样做。)printf 的隐式原型将定义如下:

    int printf();
    

    巧合的是,这个隐式原型的调用约定与您平台上printf 的实际调用约定相匹配。

    一般来说,你不能指望这种工作,而且有很多情况下它不会工作。我建议启用编译器警告来检测隐式原型声明,以便您可以修复它们(通过包含正确的标头)。

    脚注: #include 不导入库,它只是在编译时将文件粘贴到您的源代码中。 &lt;stdio.h&gt; 标头包含(直接或间接)某些原型,但该库必须单独链接。由于printf 通常位于默认链接到程序的库中,因此您通常无需执行任何操作即可使用printf

    【讨论】:

    • 是和不是。对于 C89/90,程序通常会“编译”。但请记住,printf 是一个 variadic 函数。在没有原型的情况下调用可变参数函数会导致未定义的行为。从这个意义上说,C 语言并没有真正“允许”在没有原型的情况下调用printf。当然,C99 语言甚至不会编译对未声明函数的调用。
    • @AndreyT:是的,这就是为什么我说“巧合......在你的平台上”和“你不能指望这个工作”。
    【解决方案2】:

    #include 预处理器指令不导入任何库; C语言的定义中没有import这样的概念。

    你恰好调用了一个名为 printf 的函数,而标准的 C 库(例如 Linux 上的 libc.so,我不知道 Windows 是如何调用它的)恰好通过默认。由于您使用该库已知的名称调用函数,因此它会被链接,并在运行时被调用。

    但是,您应该在编译器中启用所有警告,它会警告您调用未声明的函数。

    【讨论】:

      猜你喜欢
      • 2012-11-20
      • 2015-03-29
      • 2010-09-25
      • 2019-01-05
      • 2011-04-20
      • 1970-01-01
      • 2013-10-12
      • 2022-11-27
      • 2022-07-16
      相关资源
      最近更新 更多