所以,我知道在Java中,.java是人类可读的版本,而.class是编译的。
在c中,人类可读的版本是.c,但编译的类是否有任何单独的文件扩展名?
答案 0 :(得分:5)
C通常为本机平台(不是字节码)生成文件。在Windows上,.exe
和.dll
很常见。人们经常看到中间"对象"在许多平台上使用.o
的文件(这些文件是中间的,因为它们尚未被链接)。有一些头文件以.h
结尾。在Linux上,您通常会看到.so
库和可执行文件通常没有扩展名。在Mac上,它取决于很多东西。
答案 1 :(得分:4)
.o
(或.obj
)目标文件是已编译的.c
文件,与Java的.class
文件最接近。
它们可以在存档(.a
)中捆绑在一起,也可以将它们链接到一个实际的程序或动态库中。
答案 2 :(得分:3)
最近的模拟是C文件被编译为目标文件(通常以.o
结尾)。对象文件公开符号并链接到可执行文件中。但是,目标文件与Java .class
文件不同。
答案 3 :(得分:3)
使用C编程语言编写的程序通常编译为本机可执行文件,例如Windows .exe
文件。
大多数C编译器将每个源代码文件编译为目标文件,通常使用扩展名.o
。链接器接收一个或多个.o
文件,并从中创建本机可执行文件。
.o
文件无法与Java .class
文件直接比较。例如,您无法像运行Java .o
文件那样执行.class
文件。
答案 4 :(得分:3)
由于.class
文件在Java中有多种用途,因此可能需要有几个不同的答案。
(1)当您的Java代码声明某个类型的变量,或者使用new
创建某个类型的实例时,编译器需要知道哪些方法和其他成员可用于该类型,以及其他信息。在C中,这种信息必须在源头;通过包含.h
个文件来完成。
(2)Java .class
文件包含要执行的代码。执行程序时,会加载来自.class
文件的代码;程序还可以动态加载类文件,以便在运行时之前知道其名称。对于C,代码在目标文件(Windows或Linux系统上的.o
)中生成,然后链接到包含Windows上所有程序代码(.exe
)的单个可执行文件中;没有扩展名在Linux上)。代码也可以在程序启动后动态引入;在Windows上,可以加载.dll
动态库文件中的代码。
(3)当程序使用反射时,使用来自Java .class
文件的信息。 C没有这样的概念。
(4)调试时,调试器需要的有关变量,方法等的信息保存在.class
个文件中。对于C,它通常以符号表中的特殊格式保存在目标文件中(例如DWARF
或STABS
)。通常,在运行C编译器时必须添加一个标志,以使其存储额外的信息。