C++/c static和匿名命名空间 总结
来源:互联网 发布:宋承宪 刘亦菲 知乎 编辑:程序博客网 时间:2024/05/21 21:39
from http://blog.csdn.net/Monkeycn/article/details/5817138
static:
1、函数之外的变量就是全局变量,这个想法正确吗?
答: 在C中,完全正确。只不过按有没有加static修饰可以分为静态全局变量和一般全局变量两种。
2 如果在全局变量的前面加上static 会有什么用?
答:在C中,静态全局变量意味着两个方面。一、在生命期方面,它与一般全局变量一样,是与整个程序共存亡的;二、在可见性方面,它只在定义它的那个编译单元中可见。比如说,你在testA.c中定义了一个静态全局变量x: static int x;则你只能在testA.c的函数中引用它,在另一个文件testB.c中如果想用它的话:extern int x;然后再某个函数中使用x,则一般编译器在连接阶段会报错说找不到x这个符号。
3 如果在函数的前面加上static 会有什么用?
答:与静态全局变量差不多。简单地说,在testA.c中定义的静态函数:static void A(void)是不能在testB.c的函数中调用的,如果一定要这样的话编译器连接时会报错的。
static的用途:一般对那些非接口函数和确定外部不使用的全局变量加上static限制,可以保证不会被其它编译单元非法使用,同时也可以避免与别的编译单元中的同名符号冲突。在驱动程序中用的较多。
匿名空间:
当定义一个命名空间时,可以忽略这个命名空间的名称:
namespce {char c;int i;double d;}
编译器在内部会为这个命名空间生成一个唯一的名字,而且还会为这个匿名的命名空间生成一条using指令。所以上面的代码在效果上等同于:
namespace __UNIQUE_NAME_ {char c;int i;double d;}using namespace __UNIQUE_NAME_;
在匿名命名空间中声明的名称也将被编译器转换,与编译器为这个匿名命名空间生成的唯一内部名称(即这里的__UNIQUE_NAME_)绑定在一起。还有一点很重要,就是这些名称具有internal链接属性,这和声明为static的全局名称的链接属性是相同的,即名称的作用域被限制在当前文件中,无法通过在另外的文件中使用extern声明来进行链接。如果不提倡使用全局static声明一个名称拥有internal链接属性,则匿名命名空间可以作为一种更好的达到相同效果的方法。
注意:命名空间都是具有external 连接属性的,只是匿名的命名空间产生的__UNIQUE_NAME__在别的文件中无法得到,这个唯一的名字是不可见的.
C++ 新的标准中提倡使用匿名命名空间,而不推荐使用static,因为static用在不同的地方,涵义不同,容易造成混淆.另外,static不能修饰class
- C++/c static和匿名命名空间 总结
- C++/c static和匿名命名空间 总结
- C++/c static和匿名命名空间 总结
- 匿名命名空间或者static的使用
- C/C++:命名空间
- C 命名冲突和static 修饰符
- C/C++ static const函数调用 命名空间
- C++ Namespace命名空间和static的用法总结
- C++-namespace(命名空间)
- C++-namespace(命名空间)
- C++namespace命名空间
- C#.Net命名空间
- C++_命名空间
- C++namespace命名空间
- 【C++】命名空间
- [C++]namespace命名空间
- C\C++命名空间
- C++:命名空间(namespace)
- [技术分享] 媒体播放器通过 ISA 服务器不能播放网络广播
- Ubuntu下如何禁用IPv6
- C99的restrict关键词
- kscope --- Linux下代码阅读工具
- 政府OA项目实施要关注五个环节
- C++/c static和匿名命名空间 总结
- 设计模式第三篇 工厂模式(2) 抽象工厂模式 abstract factory
- 政府OA项目实施要关注五个环节(2)
- ORACLE空值漫谈1
- [技术分享 - TMG 篇] TMG URL 过滤功能出现故障
- javascript document.write()覆盖原文档的问题
- ORACLE空值漫谈2
- ural 1010. Discrete Function
- Java设计模式学习心得