关闭

C语言的那些小秘密之const修饰符

发表于:2011-9-06 10:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

  三、const作为全局变量

  在程序中,我们要尽可能少的使用全局变量。因为其作用域是全局,所以程序范围内都可以修改它的值,从而导致了全局变量不能保证值的正确性,如果出现错误非常难以发现。如果在多线程中使用全局变量,你的程序将会错的一塌糊涂。多线程会修改另一个线程使用的全局变量的值,如果不注意,一旦出错后果不堪设想。所以在这种情况下万不得意不要使用全局变量。我们要尽可能多的使用const。如果一个全局变量只在本文件中使用,那么用法和前面所说的函数局部变量没有什么区别。如果它要在多个文件间共享,那么就牵扯到一个存储类型的问题。

  有两种方式。

  1、用extern

  例如

  /* pi.h */
  extern const double pi;
  /* pi.c */
  const double pi=3.14;

  然后其他需要使用pi这个变量的,包含pi.h

  #include pi.h

  或者,自己把那句声明复制一遍就好。这样做的结果是,整个程序链接完后,所有需要使用pi这个变量的共享一个存储区域。

  2、使用static,静态外部存储类

  /* constant.h */
  static const double pi=3.14;

  需要使用这个变量的*.c文件中,必须包含这个头文件。前面的static一定不能少。否则链接的时候会报告说该变量被多次定义。这样做的结果是,每个包含了constant.h的*.c文件,都有一份该变量自己的copy,该变量实际上还是被定义了多次,占用了多个存储空间,不过在加了static关键字后,解决了文件间重定义的冲突。坏处是浪费了存储空间,导致链接完后的可执行文件变大。通常来说,对于存储空间字节的变化不是太大的情况下,不是问题。好处是,你不用关心这个变量是在哪个文件中被初始化的。

  下面再来看看一段代码:

#include <stdio.h>

int main()
{
 const int a=12;
 const int *p=&a;           // 这个是指向常量的指针,指针指向一个常量
 p++;                               //可以指针可以自加、自减
 p--;                                  //合法

 int const *q=&a;           // 这个和上面const int *p=&a;是一个意思
 int b=12;

 int * const r=&b;           //这个就是常量指针(常指针),不能自加、自减,并且要初始化
 //r++;                               //编译出错  

 const int * const t=&b; //这个就是指向常量的常指针,并且要初始化,用变量初始化

 //t++;                                //编译出错
 p=&b;                              //const指针可以指向const和非const对象
 q=&b;                              //合法

 return 0;
}

  为了便于代码的阅读理解,在此就直接在代码后面加注释,就不在这儿做过多的讲解了。

  综上所述,const 的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的作用就是让更多的逻辑错误在编译期被发现。所以我们要尽可能的多使用const。以上内容难免有错,如果错误,请纠正!如需转载,请注明出处!

相关链接:

C语言的那些小秘密之内存分配

C语言的那些小秘密之堆栈

C语言的那些小秘密之函数指针

C语言的那些小秘密之变参函数的实现

C语言的那些小秘密之函数的调用关系

33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号