[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 变量。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值