Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43746
  • 博文数量: 24
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-05 11:10
文章分类
文章存档

2011年(1)

2010年(3)

2009年(20)

我的朋友
最近访客

分类: C/C++

2009-11-04 16:05:49

1、 extern "C"

C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C,而 extern "C"就是其中的一个策略。函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。

2、#ifndef、#define、#endif

头文件中的编译宏“#ifndef、#define、#endif” 的作用是防止该头文件被重复引用

3. 预处理器标识#error的目的是什么?

#error 停止编译并显示错误信息 最后一句

4、const

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性。
  虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。
  问题:const变量 & 常量
  为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?

const int n = 5;
int a[n];


  答案与分析:
   1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不 过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。
  2)、注意:在 ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。
  3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

5. static
这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

static与const的区别

static作用:1、限制范围(函数,变量只能在本文件中使用) 2、设定变量存储区域(静态存储区域) const作用:声明常量,它不能被修改,它存放在常量区

6. 关键字volatile有什么含意?
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
7、Typedef和define解析
#define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。在编程中typedef目的一般有两个,一是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
#define在预处理时进行简单的替换,而typedef不是简单替换,而是采用如同定义变量的方法那样来声明一种类型。
typedef语句是在编译过程中被解析的,而#define是在编译之前的预处理过程中被解析的。#define所进行的只是对自定义别名的简单替换,而typedef则要灵活得多。
总的来说,typedef可以做到#define所能做的所有事情,而且可以做得更好。
1:(void *)ptr 和 (*(void**))ptr的结果是否相同?其中ptr为同一个指针
【解答】:(void *)ptr 和 (*(void**))ptr值是相同的
char (*str)[20];/*str是一个数组指针,即指向数组的指针.*/
char *str[20];/*str是一个指针数组,其元素为指针型数据.*/
2、如何引用一个已经定义过的全局变量? 
  答:extern 
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将哪个变量写错了,那么在编译期间会报错。
如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 
3.已知一个数组table,用一个宏定义#define NTBL,求出数据的元素个数 
【解答】:#define NTBL (sizeof(table)/sizeof(table[0]))
11.求函数返回值,输入x=9999;
  int func ( x )
  {
  int countx = 0;
  while ( x )
  {
  countx ++;
  x = x&(x-1);
  }
  return countx;
  }
  结果呢?
【解答】: 
这是统计9999的二进制数值中有多少个1的函数,且有
  9999=9×1024+512+256+15
  9×1024中含有1的个数为2;
  512中含有1的个数为1;
  256中含有1的个数为1;
  15中含有1的个数为4;
  故共有1的个数为8,结果为8。
  1000 - 1 = 0111,正好是原数取反。这就是原理。
7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 
  全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在
各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静
态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 
  从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用
域, 限制了它的使用范围。 
  static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中
说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 
  static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; 
  static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值; 
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
程序的局部变量存在于(堆栈)中,全局变量存在于(静态区   )中,动态申请数据存在于(   堆)中。
13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
   c用宏定义,c++用inline   

阅读(679) | 评论(0) | 转发(0) |
0

上一篇:链表学习

下一篇:QT学习点滴记录

给主人留下些什么吧!~~