程序员的自我修养: 程序运行的基石-C/C++运行库
2010-03-10 21:26
274 查看
一个C语言运行库大致包含了如下功能:
1. 启动与退出: 包括入口函数及入口函数所依赖的其它函数等
2. 标准函数: 由C语言标准规定的C语言标准库所拥有的函数实现.
3. I/O: IO功能的封装和实现
4. 堆:堆的封装和实现
5. 语言实现: 语言中一些特殊功能的实现.
6. 调试: 实现调试功能的代码.
在这些运行库的组成成分中, C语言标准占据了主要并且大有来头.
1. 变长参数
函数的实现如下:
2. 非局部跳转
结果: Hello World!
当调用longjmp时,运行到setjmp返回的位置,并把setjmp的返回设置为1
关于不同版本CRT的问题
1. 为什么用VC2008编译的程序无法在别人的机器上运行?
因为VC2008编译的程序使用了manifest机制, 这些程序必须依赖于相对应版本的运行库.
一个解决办法就是使用静态链接, 这样就不需要依赖于CRT的DLL.
另一办法是将相应版本的运行库与程序一起发布给最终用户.
2. 如果一个程序里面的不同obj文件或dll文件使用了不同的CRT, 会不会有问题?
如果只有obj没有dll, 这时是静态链接, 不同的obj在编译时用到了不同版本的静态CRT. 一般是不会出现问题的. 因为目标文件对静态库引用只是在目标文件的符号表中保留一个记号, 不进行链接, 没有静态库的版本信息.
但是如果含有不同版本的dll文件, 则有可能出现问题.
1. 启动与退出: 包括入口函数及入口函数所依赖的其它函数等
2. 标准函数: 由C语言标准规定的C语言标准库所拥有的函数实现.
3. I/O: IO功能的封装和实现
4. 堆:堆的封装和实现
5. 语言实现: 语言中一些特殊功能的实现.
6. 调试: 实现调试功能的代码.
在这些运行库的组成成分中, C语言标准占据了主要并且大有来头.
1. 变长参数
函数的实现如下:
#define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) //va_start取第一个参数的地址, 并在栈上向上移动指针 #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //va_arg主要是先移动指针,再取上一个值. //注意: t是指要传入的类型,应为要确定移动的指针的远近. #define _crt_va_end(ap) ( ap = (va_list)0 ) //使ap指针为0 //主要是利用栈的原理.
#include <stdio.h> #include <stdarg.h> int sum(int a, ...) { int v = 0; va_list ap; va_start(ap, a); while(a--) v += va_arg(ap, int); va_end(ap); return v; } int main() { printf("%d", sum(9, 1,2,3,4,5,6,7,8,9)); return 0; }
2. 非局部跳转
#include <setjmp.h> jmp_buf b; void f() { longjmp(b, 1); } int main() { if(setjmp(b)) printf("World!"); else { printf("Hello "); f(); } return 0; }
结果: Hello World!
当调用longjmp时,运行到setjmp返回的位置,并把setjmp的返回设置为1
关于不同版本CRT的问题
1. 为什么用VC2008编译的程序无法在别人的机器上运行?
因为VC2008编译的程序使用了manifest机制, 这些程序必须依赖于相对应版本的运行库.
一个解决办法就是使用静态链接, 这样就不需要依赖于CRT的DLL.
另一办法是将相应版本的运行库与程序一起发布给最终用户.
2. 如果一个程序里面的不同obj文件或dll文件使用了不同的CRT, 会不会有问题?
如果只有obj没有dll, 这时是静态链接, 不同的obj在编译时用到了不同版本的静态CRT. 一般是不会出现问题的. 因为目标文件对静态库引用只是在目标文件的符号表中保留一个记号, 不进行链接, 没有静态库的版本信息.
但是如果含有不同版本的dll文件, 则有可能出现问题.
相关文章推荐
- 程序基石系列之C++运行时类型转换(Runtime Cast)
- Sublime Text2 使用VS编译和运行C/C++程序(windows)
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
- 让C/C++图形程序独立运行
- 提高C++程序运行效率的10个简单方法
- 你的C/C++程序为什么无法运行?揭秘Segmentation fault (2)
- Linux C/C++获取程序运行时间
- Sublime Text3/2使用windows编译器编译和运行C/C++程序
- C++获取当前时间和计算程序运行时间的方法
- Visual Studio 2010 c++编写的程序在别的机子运行不了,提示缺少mfc100u.dll xxx100d.dll等的解决方法
- 【C++】VS2010生成的程序在安装了vc2010运行库的机器上提示“丢失MSVCR100D.dll”
- C/C++中利用空指针(NULL),提高程序运行效率
- c++学习笔记(1)——环境搭建、经典教程推荐及 Visual Studio 2005/2008中如何编译和运行C++程序
- 提高C++程序运行效率的10个简单方法
- C++实现计算程序运行时间 高精度
- 转载:c++读写文件和测试程序运行时间的例子
- C++程序运行时内存布局之----------this到底是什么?
- C++ 计算程序的运行时间
- 64位Fedora运行32位C++程序所需的类库
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法