易截截图软件、单文件、免安装、纯绿色、仅160KB

程序员的自我修养: 程序运行的基石 C/C++运行库

一个C语言运行库大致包含了如下功能:
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文件, 则有可能出现问题.


相关文档:

python的C、c++扩展

python的C、c++扩展
http://blog.chinaunix.net/u3/110228/showart_2148725.html
python的强大不仅表现在其功能上,而且还表现在其扩展能力上。
使用C/C++很容易编写python的模块,扩展python的功能。
同时将性能要求比较高的代码使用C/C++编写,能更好的弥补
脚本语言执行速度慢的缺陷。
1. python的C语言扩展
1.1 ......

C与shell混合编程


在linux上写程序、做网管的人,或多或少都会几种脚本。脚本语言灵活的变量类型、强大的正则表达式处理能力,再加上linux系统本身的管道、重定向以及丰富的命令行工具,让你编程起来游刃有余。
  而C语言固然有种种优势,但不可否认,很多场合下,用脚本语言更为方便,比如我们将举例说明的对配置文件的处理。
  先 ......

转载:Hadoop 应该用C++实现,而不是Java

http://www.trendcaller.com/2009/05/hadoop-should-target-cllvm-not-java.html
Sunday, May 10, 2009
Hadoop should target C++/LLVM, not Java (because of watts)
< type="text/javascript">
digg_url="http://www.trendcaller.com/2009/05/hadoop-should-target-cllvm-not-java.html";
Over the years, ......

C/C++ 宏详解

http://demonstyle.blog.163.com/blog/static/13143429020091010112159/
C/C++ 宏详解
ic/c++ 2009-11-10 01:12:15 阅读18 评论0 字号:大中小
众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有
一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型 ......

C/C++程序内存分配详解


一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。
2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号