C 标准库 函数 源代码的实现 和 分析
//库函数实现
char *strcat (char *dst, const char *src)
{
char *p = dst;
while (*p)
p++;
while ((*p++ = *src++))
;
return dst;
}
char *strncat (char *s1, const char *s2, long unsigned int n)
{
char *dest = s1;
char c;
while (*s1) s1++;
c = '\0';
while (n > 0)
{
c = *s2++;
*s1++ = c;
if (c == '\0')
return dest;
n--;
}
if (c != '\0')
*s1 = '\0';
return dest;
}
char * strcpy (char *d, const char *s)//
{
char *r = d;
while ((*d++ = *s++));
return r;
}
char *strncpy (char *s1, const char *s2, long unsigned int n)
{
char *dest = s1;
for (; *s2 && n; n--) //n 如果大于s2的长度,则设置0
*s1++ = *s2++;
while (n--)
*s1++ = 0;
return dest;
}
void * memcpy (void *dst, const void *src, long unsigned int n)
{
const char *srcp;
char *dstp;
srcp = src;
dstp = dst;
while (n-- != 0)
*dstp++ = *srcp++;
return dst;
}
void *memmove (void *dst, const void *src, long unsigned int n)
{
const char *srcp;
char *dstp;
srcp = src;
dstp = dst;
if (srcp < dstp)
while (n-- != 0)
dstp[n] = srcp[n];
else
while (n-- != 0)
*dstp++ = *srcp++;
return dst;
}
void *memset (void *dst, int c, long unsigned int n)
{
while (n-- != 0)
n[(char *) dst] = c; // 即 (char*)dst[n] = c;
return dst;
}
库函数力求简洁,因此存在一定的安全的问题,这是在使用过程中特别注意的地方。也因此VC2005才推出_s的所谓的安全函数。也就是多加了判断位。
相关文档:
关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的。
VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,为了跟 Windows API 保持一致,建议使用 __stdcall 方式。
调用约定跟堆栈清除密切相关。如果写一个汇编函数,给 C/C++ ......
1.1 变量作用域
1.1.1 几种常见类型变量的作用域
作用域(scope)或者可见性是指变量在程序内的可见和可引用的范围。
比如:
1、 全局变量在所有的文件都可见,那他的作用域就是所有文件;
2、 static定义的全局变量,只在定义它的源文件中可见,那他的作用域就是其所在的源文件;
3、 函数内部的局部变量,只在其函数 ......
学东西,往往实例才是最让人感兴趣的,老是学基础理论,不动手,感觉没有成就感,呵呵。
下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。
或许这个实例没有实际运用的价值,但是稍微改动一下,我们就可以用到其他地方去拉。
下面是我们的代码:
/*thread_example.c : c multiple thread programmi ......
GCC安装成功,所需文件有:
libf2c-3.3.2-1.i386.rpm
libstdc++-devel-3.3.2-1.i386.rpm
glibc-kernheaders-2.4-8.36.i386.rpm
glibc-headers-2.3.2-101.i386.rpm
glibc-devel-2.3.2-101.i386.rpm
gcc-objc-3.3.2-1.i386.rpm
binutils-2.14.90.0.6-3.i386.rpm
gcc-3.3.2-1.i386.rpm
gcc-c++-3.3.2-1.i386.rpm
autom ......
打开文件或者程序
1、ShellExecute(0,"open","c:\\abc.exe","","",SW_SHOW);
2、WinExec("c:\\a.exe",SW_SHOW);
3、system("dir c:\\");
关闭文件
m_hwnd = FindWindows("Notepad","a.txt-记事本");
SendMessage(m_hwnd,WM_SYSCOMMAND,SC_CLOSE,0);
隐藏DOS窗口
#pragma comment( linker, "/subsystem:\"windows\" ......