Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318964
  • 博文数量: 63
  • 博客积分: 2344
  • 博客等级: 大尉
  • 技术积分: 628
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-13 11:09
个人简介

有一种沉默叫霸气,有一种内敛叫个性,有一种简单叫深遂,有一种不屑叫自我

文章分类

全部博文(63)

文章存档

2013年(10)

2012年(12)

2011年(1)

2010年(9)

2009年(31)

分类: C/C++

2009-07-15 15:03:50

1. 所有函数都是平行的,不能嵌套定义,可以相互调用
2. 外部变量与局部变量同名时,局部变量作用域内屏蔽外部变量
3.

 用户区

作用 

 程序区

代码 

 静态存储区

 全局变量、static变量

 动态存储区

 形参、auto变量、函数调用的现场保护和返回地址

 
 
 
 
 
 
 

 
4.

 存储类别

说明 

 auto

形参和函数内定义的局部变量 

 static

 编译时赋值(默认为0或null),不能被其它函数应用

 register

 声明形参和auto变量

 extern

 扩展外部变量的作用域(文件内、文件间)。编译时,先在本文件中找外部变量的定义,找到本文件扩展作用域。否则,在连接时从其他文件中找变量定义,找到,扩展作用域到本文件。

5. 限制外部变量只限于本文件使用:用static声明
6.

 

 定义

声明 

 函数

 函数实现

 函数原型

 变量

 建立存储空间时的声明

 

 外部变量

 初始化时,只能有一处

多处 

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;
}

10. extern "c"实现C++C及其它语言的混合编程。  
extern "C"是连接申明(linkage declaration),extern "C"修饰的变量和函数是按照C语言方式编译和连接的.

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++实现文件,调用addcppFile.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;

}

 

 

阅读(1050) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~