有一种沉默叫霸气,有一种内敛叫个性,有一种简单叫深遂,有一种不屑叫自我
分类: C/C++
2009-07-15 15:03:50
用户区 |
作用 |
程序区 |
代码 |
静态存储区 |
全局变量、static变量 |
动态存储区 |
形参、auto变量、函数调用的现场保护和返回地址 |
存储类别 |
说明 |
auto |
形参和函数内定义的局部变量 |
static |
编译时赋值(默认为0或null),不能被其它函数应用 |
register |
声明形参和auto变量 |
extern |
扩展外部变量的作用域(文件内、文件间)。编译时,先在本文件中找外部变量的定义,找到本文件扩展作用域。否则,在连接时从其他文件中找变量定义,找到,扩展作用域到本文件。 |
|
定义 |
声明 |
函数 |
函数实现 |
函数原型 |
变量 |
建立存储空间时的声明 |
|
外部变量 |
初始化时,只能有一处 |
多处 |
7. 程序被编译后,变量名已转换成变量地址。通过地址(变量名)对变量的访问,称为“直接访问”。“间接访问”,将变量的地址放入另一个变量中。
8. 变量的交换:
swap( int a, int b ){
int temp;
temp = a;
a = b;
b = temp;
}
swap( int a, int b ){
a = a + b;
b = a - b;
a = a - b;
}
swap( int a, int b ){
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
9. 计算字符串的长度:
// 递归(浪费时间,空间)
int mystrlen(char *p)
{
if(*p)
return mystrlen(p+1)+1;
return 0;
}
// 使用库函数strchr
int mystrlen(char *p)
{
return strchr(p, '\0')-p;
}
// 使用库函数printf或sprintf
int mystrlen(char *p)
{
//return (printf ("%s", p));
return (sprintf(p,p)); // 这样也可以。。。
}
// 不用库函数,不用递归
int mystrlen(char* p)
{
if('\0'==p[0])return 0;
if('\0'==p[1])return 1;
if('\0'==p[2])return 2;
if('\0'==p[3])return 3;
for(*(int*)p=4;'\0'!=p[*(int*)p]; ++(*(int*)p))
{
}
return *(int*)p;
}
void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
extern "C"的惯用法
(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
源代码如下:
/* c语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c语言实现文件:cExample.c */
#i nclude "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++实现文件,调用add:cppFile.cpp
extern "C"
{
#i nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。
源代码如下:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文件 cppExample.cpp
#i nclude "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C实现文件 cFile.c
/* 这样会编译出错:#i nclude "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}