c函数与编译
1. 函数长度是否影响c的执行速度或者编译速度java中函数名很长,读起来
函数名、变量名长度不会影响执行速度,编译后的名称不是源代码中的名称。对编译速度的影响微乎其微,可以忽略不计。C语言出现的早,那时有个规定外部变量名最长6个字符。那时存储空间小,源代码也是占用越少空间越好。另外,以前没有自动补全功能,函数名、变量名短可以少打很多字,开发效率能高些。
现在,写C完全可以像Java一样使用长名称,清晰易读。
2. C语言中函数的地址在编译时就分配好了,为什么不会产生地址冲突运行时刚好那个地址有别的程序在用
函数的具体武理地址不是编译的时候分配的,是运行的时候由系统分配的!如果你看一下生成的汇编代码你就会发现进入函数时的操作是将返回地址压栈后通过CALL跳转到函数开头处执行,压栈的函数地址都是偏移量,实际地址在运行时通过基址加减偏移量得出。另外通常程序的内存空间是专用的,两个程序的空间互不冲突,普通用户程序不可以访问其他程序的内存空间!
3. C/C++语言中编译阶段,编译到 函数调用的语句时,是怎么编译的
函数体被编译成对应的一段汇编代码,在符号表中会生成一个函数名指向这段代码的入口地址。所有调用此函数的地方都会被编译成CALL 函数名指令,然后连接时将函数名替换为函数的入口地址。
4. C语言 调用数学库函数时,编译预处理命令为include math.h 。为什么错
#include <math.h>
5. 宏和函数的区别以及C语言的编译链接过程
宏在编译之前,需要进行预处理,将宏直接提换成宏定义的代码,是直接替换,也就是说,在预处理之后,你再看代码,发现宏定义已经被替换过来了,你看到是你定义之后的那一串代码。
而函数,在编译之后,有一系列调用函数的过程,比如,传参,压栈等,这部分是编译器所做的。
C 语言编译链接过程:
test.c(原始代码) --> 预处理 --> test.i(经过预处理的)--> 编译 --> test.s(汇编代码)--> 汇编 --> test.o(目标文件,其实这部分已经是单个文件的完整二进制文件了,只是还不能执行,如果不懂这句话,可以再问我,其实这部分知识,平时也很少遇到) --> 链接 --> test (可执行文件,比如一个程序由3个代码文件共同生成,那么就会有3个.o格式目标文件,链接是把多个目标文件真正的联系在一起,比如a.o 中使用了 b.o中的一个函数,那么它们两个之间的地址是如何确定的(同理,可引申到使用函数库的问题,使用printf函数,也是需要链接器进行确定printf函数地址,才能知道如何调用。)这个就是链接器的作用)