具有链接的实体,包括名字空间级的变量和函数,都是需要分配内存的。具有链接的实体如果在源文件(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

转载于:https://www.cnblogs.com/zhenjing/archive/2010/10/14/1851573.html

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

  1. [C++再学习系列] 前置++与后置++

    前置++: type operator++(); 后置++: const type operator++(int ); 为了编译器区分前置和后置++,C++规定后缀形式有一个int类型参数,当函数被调 ...

  2. [C++再学习系列] 变量的声明、定义与extern关键字

    变量的声明与定义: A definition of a variable allocates storage for thevariable and may also specify an initi ...

  3. [C++再学习系列] 虚函数的4条规则

    对于常规的基类函数来说: 1 尽量使用非虚拟接口模式(NVI)让接口函数成为非虚拟的. 2 尽量让虚函数成为私用的. 3 只有当派生类需要调用基类对某个虚函数的实现时,才把虚函数声明为保护的. 4 基 ...

  4. [C++再学习系列] 函数模板和类模板

    函数模板和类模板 C++ 提供类模板和函数模板.函数模板允许重载 ,而类模板不允许重载(类无重载概念).类模板可以进行全特化和偏特化,而函数模板仅能够全特化 .因此,写一个看似函数模板偏特化的函数模板 ...

  5. [C++再学习系列] 引用和指针

    下面是网上关于引用和指针区别的常见答案: 引用和指针有如下三种区别: 1 引用必须在声明时初始化,而指针不用: 2 NULL不能引用,而指针可指向NULL: 3 引用一旦声明,引用的对象不能改变(但对 ...

  6. RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78214267 既然已经可以通过 RTSP 获取h264 裸流了.那么通过 F ...

  7. 音视频开发(17)---RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    RTSP再学习 -- 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中 https://blog.csdn.net/qq_29350001/article/details/7821426 ...

  8. Rasa 3.x 学习系列-Rasa [3.4.1] - 2023-01-19新版本发布

    Rasa 3.x 学习系列-Rasa [3.4.1] - 2023-01-19新版本发布 任何人都可以学习Rasa之优秀Rasa学习资源推荐 欢迎同学们报名Gavin老师的Rasa系列课程,任何人都可 ...

  9. Rasa 3.x 学习系列-Rasa [3.5.8] -2023-05-12新版本发布

    Rasa 3.x 学习系列-Rasa [3.5.8] -2023-05-12新版本发布 当自定义动作设置的值与槽的现有值相同时,将触发SlotSet事件.修复了这个问题,使AugmentedMemoi ...

最新文章

  1. 针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言439-448条如下:
  2. 服务器测速,php在线测速
  3. 浏览器的工作过程(转)
  4. SlackTextViewController
  5. Linux下的grep命令详解
  6. scapy on openwrt
  7. unity update 协程_Unity协程,停止协程及yield return使用_019
  8. nametuple用法(转)
  9. etcd v3 集群——简单配置
  10. python 枚举类型_Python枚举类
  11. access数据库窗体设计实验报告_access计算机实验报告:窗体
  12. linux学习: sudo命令(ubuntu)
  13. Java环境变量配置
  14. matlab菲涅尔衍射,基于matlab的菲涅尔衍射仿真
  15. <hr> 标签:定义水平线
  16. 绘王两款便携数位屏同时发售,全贴合防眩光屏配硬笔
  17. 老少恋中的愉悦和不安
  18. 【离线语音专题②】安信可语音开放平台的使用——VC系列SDK的获取
  19. Fater-Rcnn原理详解
  20. 计算机睡眠无法锁屏是怎么设置密码,教你电脑待机锁屏怎么设置

热门文章

  1. 检查Python列表项是否在另一个字符串中包含一个字符串
  2. 用Python编写单元测试:如何开始? [关闭]
  3. matlab算法用python做_机器学习笔记—朴素贝叶斯算法实现(matlab/python)
  4. led灯条维修_海尔液晶电视LD32U3100背光通病维修(非灯条问题)
  5. 差速驱动机器人轮间距校准实验
  6. 修改网页代码_利用网页监控优势,做百度自动推送
  7. 模拟京东按s键选中输入框
  8. 使用DQL查询数据(重点)
  9. linux之debian自动登录
  10. php 制作日记本,photoshop制作精美日记本