C语言可变参数编程
在使用变长参数的函数(这里假设是func)实现部分其实用到了stdarg.h里面的多个宏来访问那些不确定的参数...
编写简单的C运行库(三)
在编写简单的C运行库(二)中主要实现了对有关文件操作函数的实现,接下来主要实现有关字符串的函数,如itoa,strcmp,strcpy,strlen函数,这些函数并没有用到系统调用,所以也就不用向实现文件操作的函数那样使用内嵌汇编,这些函数的定义都放在string.h中。实现了字符串函数之后,就大概实现了一个小型的c运行库,虽然很简略,但对于理解c库函数运行原理、所用的关键技术有了比较深刻的认识。最后用这个小的c运行库来编译运行一个简单的测试程序,用以测试我们的库能否正常的工作。
字符串函数 字符串函数中主要是实现itoa函数有点难度,其它的都还比较的简单,所以这里主要讲下itoa函数的实现。
12345678910111213141516171819202122232425262728293031323334char *itoa(int n, char *str, int radix){ char digit[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char *ptr = str, *ba ...
编写简单的C运行库(二)
在前面编写简单的C运行库(一)中主要实现了调用main函数前的初始化、获取参数和环境变量、退出程序等工作。接下来我们真正实现c标准库中的一些函数(主要是文件操作、字符串操作函数)。不过我们对这些函数的实现力争简单,对于效率方面考虑的不是很多,因为目的主要还是学习神秘的库是怎么实现的。
文件操作 c中的标准I/O库都是带有缓存的,我们在这里为了实现的简单,将缓存省略了,直接包装了有关文件操作的系统调用。现在我们直接看文件打开的函数:
12345678910111213static int open(const char *pathname, int flags, int mode){ int ret; __asm__ volatile( "int $0x80" :"=a"(ret) :"0"(5),"b"(pathname),"c"(flags),"d"(mode) ); if ...
编写简单的C运行库(一)
看了《程序员自我修养》这本书后,对目标文件、可执行文件的结构有了比较清晰的了解,对目标文件链接成可执行文件的过程和程序运行库有了大致的认识。不过正如“纸上得来终觉浅,绝知此事需恭行”,很多东西看似容易,但实践的时候却往往不是这样,在实践中往往能发现很多的问题。《程序员自我修养》这本书我觉得是理论与实践很好的结合了,它在最后一章给出了一个c和c++运行库的简单版的实现,通过实现这个可以更为深刻地理解可执行文件的结构、程序的执行、运行库的实现。参考这边书,我在linux下实现的一个简单的c运行库,这个运行库主要实现了文件操作、字符串操作、动态内存分配三个方面。
程序的入口函数实现 当被问到程序的入口函数是什么的时候,很多人都会回答是main函数。其实这是不准确的,因为如果main是第一个开始执行的函数,那么对于在main函数外面定义的变量,特别是c++中的对象,由谁来初始化它们呢?还有就是我们用atexit函数注册的清理函数在main函数结束之后才被调用。种种都说明在main函数之外还有函数,它负责建立程序执行所需的环境,包括变量的初始化和堆的初始化,清理函数的调用,构造函数和析构函数调 ...
使用VC和DirectShow从摄像头中读取图像
使用VC和DirectShow从摄像头中读取图像
C++ 复制文件到剪切板
C++ 复制文件到剪切板实现代码
C++ DirectShow 打开多个摄像头
C++ DirectShow 打开多个摄像头
如何在 C++11 中使用 Lambda 表达式
Lambda 表达式不仅具有函数指针的灵活性,还可以通过捕获局部变量提高可扩展性。本文介绍 Lambda 表达式的语法和用法。
C++11新特性整理
C++11新特性整理
C++基础入门知识点整理
C++基础入门知识点整理