当程序编译后link,讲函数地址保存在段寄存器中,代码段内,当某处调用此函数时(汇编代码CALL),将此地址压入栈中,并且根据指令地址寄存器(程序计数器内)中保存的值计算到该函数地址的偏移量,随后通过__cdecl等调用方式将参数和局部变量压入栈中。具体的过程比较复杂,具体应该参照PE结构等。比较深入,我也只是粗略了解
可以参考计算机组成与设计一书
----------------------------抄过来的资料---------------
有的时候产品容易被默认安装到c:\Program Files\这样包含空格的路径下,那么在命令行中输入一个带空格的file path作为参数往往会出错。所以大家都流传着这样一种说法:咱们公司的产品安装的时候选择的目录千万不要包含空格。
但是,一个那么大的产品装好了,使用命令行配置的时候发现path带空格命令过不去,而卸载重装太恐怖了,怎么办?
现在有两个办法来解决这个问题
1)用缩写。比如c:\Program Files缩写为c:\Progra~1
再来刨根问底查查这个命名是否有规则,于是找到:
文件夹(sub-directry)名称,以前是不允许带空白的,后来允许带空白,但由于有了空白,许多命令出现二义性,于是采用双引号括起来的办法。例如:
cd Documents and Settings
按老定义 等于 CD Documents, CD 命令找不到名叫Documents 的 directry
于是采用双引号:
cd “Documents and Settings“
但用到 set PATH 时很麻烦,名字太长,双引号时常括错。于是采用8个字符缩写,即写头六个字母(略去空白),另加波浪号和1。例如:
"Documents and Settings“ -- DOCUME~1
"Local Settings" -- LOCALS~1 (注意略去空白,用了第二个词的字母,凑成六个,再加波浪号和1)。
于是,这种方法成了规定。
再来个十万个为什么的下一个,如果多个文件前6字符一样怎么办?为什么最后是1而不是0或者其他数字呢?看看这个例子
假设下面是你的C盘根目录中的文件夹:
Program Files
Progra file
Progra zhang
则三个目录分别表示为:C:\Progra~1; C:\Progra~2; C:\Progra~3;
2)绕过去,创建一个镜像。例如在cmd中输入 subst w: "C:\Documents and Settings\hopeshared"。然后就可以直接用w:\替代C:\Documents and Settings\hopeshared了
你把被调用的c文件中的main()函数改成其他名字 如fun();
然后在另一个c文件的main()函数中调用fun();
只要保证一个C工程只有一个main()做入口点就行了,至于保留哪个main函数,那就要看你程序的逻辑了,注意main函数是入口点的概念
以上就是关于C语言中,程序调用函数是怎么实现的全部的内容,包括:C语言中,程序调用函数是怎么实现的、c语言 程序调用、C语言中如何用一个程序调用另一个程序,两个程序都是.c文件。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)