URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 13 » c语言static详解
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
c语言static详解
c语言static详解 - sixpeople [2006-07-06 20:50 | 3,003 byte(s)]
 
Re: c语言static详解 - grip2 [2006-08-03 11:06 | 133 byte(s)]
 
Re: c语言static详解 - magic8421 [2006-07-17 18:35 | 15 byte(s)]
 
Re: c语言static详解 - zxm927 [2006-07-11 20:23 | 34 byte(s)]
 
Re: c语言static详解 - shy828301 [2006-07-12 14:43 | 47 byte(s)]
 
Re: c语言static详解 - IN_FLAMES [2006-07-12 08:47 | 22 byte(s)]
 
 
Subject: c语言static详解
Author: sixpeople    Posted: 2006-07-06 20:50    Length: 3,003 byte(s)
[Original] [Print] [Top]
http://www.heloworld.org/bbs/viewtopic.php?t=43

c语言中static关键字有两个作用,一是文件作用域,二是函数作用域。

一、文件作用域

文件作用域关键字static的作用是,以static申明的全局变量、函数不得被其他文件所引用,例如:

//这是mystr.c文件的内容
#include <string.h>

static int num = 10;

int mynum = 100;

static int str_len(char *str)
{
return strlen(str);
}

int mystr_len(char *str)
{
return str_len(str) + num;
}

当你mystr.c文件中的str_len函数加上了static关键字,你便不能在其他的地方复用这个函数,譬如,你不能这样写:

//这是main.c 的内容

#include <stdio.h>

int main()
{
int len;
len = str_len("hello, world ");
printf("%d %d ", num, len )
return 0;
}

gcc main.c mystr_len.c

将不能编译通过,因为mystr.c中的num变量和str_len函数都用了static关键字,导致他们只能在mystr.c中被使用,如文件中的mystr_len函数可以引用num变量和str_len函数。


//这是main.c 的内容

#include <stdio.h>

int main()
{
int len;
len = mystr_len("hello, world ");
printf("%d %d ", my_num, len )
return 0;
}

当不用static关键字时,等同于extern,即
int mystr_len(char *str)
{
return str_len(str) + num;
}



extern int mystr_len(char *str)
{
return str_len(str) + num;
}

是一样的。


二、函数作用域

static另外一个用途是函数内部静态变量,最常用的情况是

int *test()
{
int num = 100;
int *ptr = &num;
return ptr;
}

int main()
{
printf("%d ", *test);
return 0;
}

该函数返回整数num的指针,在main函数中打印*test将会出现段错误,因为num做为test函数内部,只能在test内部被访问。以下程序是正确的。

int *test()
{
static int num = 100;
int *ptr = &num;
return ptr;
}

int main()
{
printf("%d ", *test);
return 0;
}

该程序中num变量加了关键字static,函数运行结束后,依然可以在其他地方被引用,只是不能直接通过变量名访问,而要间接通过指针访问,原因是 static变量存储在全局数据段中而不是函数栈中。读者可以将它看作特殊的全局变量,只是其他地方只能通过指针来访问,而不能直接通过变量名访问。
----
http://heloworld.org 针对研发人员,欢迎您的参与。
[Original] [Print] [Top]
Subject: 不介意的话 请以后把帖子的内容也都发出来 谢谢
Author: teawater    Posted: 2006-07-06 23:00    Length: 0 byte(s)
[Original] [Print] [Top]
----
科学家会武术 流氓都挡不住
[Original] [Print] [Top]
Subject: Re: c语言static详解
Author: zxm927    Posted: 2006-07-11 20:23    Length: 34 byte(s)
[Original] [Print] [Top]
能不能从编译器、链接器的角度讲讲。
----
[Original] [Print] [Top]
Subject: Re: c语言static详解
Author: IN_FLAMES    Posted: 2006-07-12 08:47    Length: 22 byte(s)
[Original] [Print] [Top]
楼主最后一句不是说了么
----
我是马甲
[Original] [Print] [Top]
Subject: Re: c语言static详解
Author: shy828301    Posted: 2006-07-12 14:43    Length: 47 byte(s)
[Original] [Print] [Top]
静态变量中初始化的在.data段,未初始化的在.bss段
[Original] [Print] [Top]
Subject: Re: c语言static详解
Author: magic8421    Posted: 2006-07-17 18:35    Length: 15 byte(s)
[Original] [Print] [Top]
好文... 顶..~~~
[Original] [Print] [Top]
Subject: Re: c语言static详解
Author: grip2    Posted: 2006-08-03 11:06    Length: 133 byte(s)
[Original] [Print] [Top]
你的说法有问题。C中static是一个Storage-class specifiers,它的作用有两个(不考虑其他的扩展),一个是作用域的限制,一个是指定存储方式。
----
Simply the best
[Original] [Print] [Top]
« Previous thread
看strlen有感
C/C++编程版
13
Next thread »
在问UDP广播问题,附件中代码!
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:04, cost 0.069746971130371 ms.