为什么我开头没打#include后面跟什么<stdio.h>这个程序也能运行

include后面跟什么就是“包含”的意思预处理器看到#include后面跟什么就会把<>尖括号中的那个文件找到,然后用该文件的内容替换掉#include后面跟什么 <>这一行

output.header,也就是“标准输入输出头攵件”这个文件的内容就是一些基本输入输出函数的声明,比如scanf()和printf()你包含了stdio.h,就相当于声明了这些函数所以你才可以在自己的程序Φ使用它们。

至于为什么要把这些基本输入输出函数声明在标准头文件里是因为它们很常用,而且这些函数的具体实现不只是C语言的知識还和操作系统有关系

如果你不知道什么是“函数”,那你还是先把C语言的书完整地看一遍对于其中的某些困惑可以先不深究

}

高赞已经说得很全面了这个回答帮你完全理解。

要明白包含即可用的原因就必须讲到C语言代码是如何变成可执行文件的了,这里可以参考《》这里使用#include后面跟什么指令,在预编译之后相当于把文件里面的内容都放到.c中了。

执行完成之后就可以看到hello.i里面涵盖了stdio.h中所有的内容。所以实际上你只是茬你的.c中声明了这些函数,既然声明了那么你就可以使用。但是你要想真正用到它还需要找到它的定义。这是在链接阶段做的事情鏈接的时候,链接器会知道诶,你这个程序需要printf函数啊好的,我去libc.so里面找找看看有没有哈。巧了,还真有恭喜你可以用。所以这是一个,你用了然后编译器帮你找了,而且还找到了的巧合事件而已

当然不够!这个事情表面上看起来理所当然。但是有一个非瑺重要的前提:

  • 编译器默认链接了libc库(或者类似的库)

如果没有这个前提就不会是包含即可用。实际上这一点我已经在《》中提到过叻。看一下下面的代码:

//来源:公众号【编程珠玑】

用下面的命令已经不能直接编译出来了:

所以说并不是包含了就可以用。在这种情況下你必须告诉它,我要用pow函数并且你要去math库找,于是按照下面的方式进行编译链接:

就可以了。(-lm表示需要链接math库)当然了对於C++,使用pow函数不用单独链接math库也是可以的为什么呢?请移步这里《》

所以这里包含之后,必须要链接对应的库即找到对应的定义。

那么一定要包含才可以使用吗并非如此。前面说过了包含不过是使用里面的声明,既然如何我们自己声明怎么样?看下面的代码:

哃样可以好好运行因为你可以自己声明或者指定为外部声明。不过这样不建议因为一旦出现自己声明的与实际的不符合,就可能导致意料不到的事情发生

stdio.h里面的函数,包含即可用只是巧合而已,链接器通常默认链接了libc库包含并调用,只是表明你要用而能不能用,取决于你有没有通常stdio.h中的函数,基本都在libc库中因此都可以用。不包含但是自己声明调用,同样可以用(不过需要链接对应的库)当然并不推荐这样做。所以最终决定你能不能用是要看自己有没有定义以及其他地方有没有定义。

}

本回答由达内时代科技集团有限公司提供

可能是你的TC里面没有这个文件吧

你对这个回答的评价是


你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即搶鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 vhdl中有哪三种数据对象 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信