当我#include或import的时候,我到底干了什么?
2015-01-07 18:33
302 查看
C语言中的#include
学习C语言的时候,大家都写过这么一个hello world#include <stdio.h> int main() { printf("hello, world"); return 0; }
但如果没有第一句
#include <stdio.h>,编译是通不过的
因为printf这个函数没有被声明,因为C语言要求,函数必须先声明再调用
事实上,
#include <stdio.h>所做的仅仅是把stdio.h这个文件给包括进来了,就像你找到stdio.h文件,并把所有内容复制到main函数的前面,效果是完全一样的。
stdio.h包括的是对C语言标准库中一系列函数的声明(当然也有printf的),通常它在你的编译器安装位置的include目录下。编译器是会默认的去这个目录寻找你include的文件的。
所以,
#include <stdio.h>之后,程序就能编译通过了。而printf的实现在C语言标准库libc.a中,标准库的实现是会被编译器自动链接进你的程序的。
知道了原理,我们有另一种方式去成功的调用printf函数,那就是自己声明它。
int printf(const char *format, ...); int main() { printf("hello, world"); return 0; }
相信我,这个程序也是能编译成功而且输出正确结果的,因为第一句话和
#include <stdio.h>的目的是一样的,只不过是仅仅声明了其中一个函数而已。
Java中的import
如果你以为import跟
#include一样是把整个文件包含进来,那就错了。事实上,
import的作用是在写程序的时候,不用把类或者变量的长长的全名打出来。
说到这里,不得不说一下Java组织源代码的方式。
Java的每个public的类都是一个文件,它位于某个package之中,而package则是许多文件夹构成的一个路径。
如下图,假设我的Java工程的源代码都在src文件夹下,cc.chenjr.mypackage就是一个package(注意它实际上就是文件夹),MyClass是这个package下的一个类。
src └── cc └── chenjr └── mypackage └── MyClass.java
为了避免与其他package下的MyClass类混淆,它有一个全名是cc.chenjr.mypackage.MyClass。比如System的全名是java.lang.System。我们不用去
import java.lang.System是因为编译器帮我们做了这件事。
那在别的文件中要用cc.chenjr.mypackage.MyClass的时候,打全名实在太麻烦,所以我们就告诉编译器,我这个文件里的MyClass就是cc.chenjr.mypackage.MyClass而不是其他的MyClass。这就是
import的作用了。
同样,每个.java文件的第一句
package cc.chenjr.mypackage;是告诉编译器,我这个类是在这个package下面的。如果这个类的文件被移动到别的文件夹下,是编译不了的。
当然,如果我们非要用到两个MyClass,其中有一个就不得不打全名了,比如这样,假设我自己有和Java库中名字冲突的类并import了它们,我想用Java的标准库的类就只能打全名了。
package cc.chenjr.mypackage; import cc.chenjr.mypackage.List; import cc.chenjr.mypackage.ArrayList; public class Test { public static void main(String[] args) { java.util.List list = new java.util.ArrayList(); } }
相关文章推荐
- 当push的时候应该注意的ODEX到底是什么文件
- Android 看到什么写什么——关于有时候Android studio编写的时候大R丢失并且import出不来的问题
- python函数在传参的时候,到底在传些什么?
- 我们在配置OpenAL的时候到底做了什么
- laravel在启动的时候到底做了什么
- 什么?What?调用系统的相册和相机的时候,系统按钮全是这种小白块,到底什么鬼??
- 绝对定位的时候它的包含块到底是什么
- 当你在设置里修改字体大小的时候,到底在修改什么
- 当我把电脑500G硬盘格式化了的时候,在想些什么
- Java Web基础知识之文件下载:当你下载文件的时候到底发生了什么?
- 当你在设置里修改字体大小的时候,到底在修改什么
- 腾讯小米们在抢Wi-Fi入口的时候,到底在抢什么?
- 当你在设置里修改字体大小的时候,到底在修改什么
- 要什么?我帮你写代码的时候也想知道你到底想要什么
- Java Web基础知识之文件下载:当你下载文件的时候到底发生了什么?
- java 字符串使用+号的时候 到底发生了什么
- 我们在使用jQuery的时候,到底在使用什么?
- 当我们在谈大佬的努力的时候,到底在谈什么?
- 我们在建立Win32工程的时候,要选择是Win32控制台应用程序还是Win32项目,那么两者到底有什么区别呢?
- 我根本不知道自己到底喜欢什么,将来该做什么?【用于自己迷茫的时候自我提醒】