[C++再学习系列] 具有链接的C++实体-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

[C++再学习系列] 具有链接的C++实体

简介:

具有链接的实体,包括名字空间级的变量和函数,都是需要分配内存的。具有链接的实体如果在源文件(cpp)中出现多次,将意味着多次分配内存,每个内存空间定义一个特定的实体。这会导致:1) 空间膨胀;2) 出现多个变量,变量的状态不共享。

因此,不能将下面的代码放在头文件:

// avoid defining entities with external linkage in a header

int fudgeFactor;

std::string hello("Hello, world!");

void foo() {/* … */}

 

上述的全局变量和函数定义,在该头文件被多个源文件包含时,将导致连接错误,编译器将报告存在名字重复。

问题的解决方案:

//put just the declarations in the header:

extern int fudgeFactor;

extern string hello;

void foo();         //"extern" is optional with function declarations

 

//The actual definitions go in a single implementation file:

int fudgeFactor;

string hello("Hello, world!");

void foo() {/* … */ }

 

更应该注意的是static的头文件链接实体:

// avoid defining entities with static linkage in a header

static int fudgeFactor;

static string hello("Hello, world!");

static void foo() {/* … */ }

C++中,static数据和函数的重复是合法的。编译器将static对象解释成:每个文件都有一个私有副本(static的作用域是文件)。这意味着编译器不会报错,这样会导致每个文件都拥有自己的独立副本。故要慎用static变量。

 

注:个人理解:何为具有链接的实体呢?通常而言,变量和函数的定义即是。

变量和函数定义的讨论,详见:http://www.cnblogs.com/zhenjing/archive/2010/10/12/1848691.html


本文转自 zhenjing 博客园博客,原文链接:http://www.cnblogs.com/zhenjing/archive/2010/10/14/1851573.html   ,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: