分开编译

不要把变量和函数的定义放到头文件中。

可以分开编译源文件,然后将它们连接起来生成最终的可执行文件。

如果你只修改了一个文件,你可以只重新编译这个文件,之前编译过的其他文件就不需要再次编译了,这样更容易管理大型程序。

C和C++提供了#include,不需要在每个源文件中去声明一遍需要的东西,而只需要用#include去包含头文件就可以了。

不要把函数定义或者变量声明放到头文件中。

比如,在头文件中定义了一个函数,然后这个头文件被另外两个原函数所包含。这样在单个程序中就会包含该函数的重复定义,从而导致错误。除非这个函数是内联的。

头文件中通常包含如下玩意儿:

  • Function Prototypes(函数原型)
  • Symbolic constants defined using #define or const(使用define或者const定义的符号变量)
  • Structure declarations(结构体定义)
  • Class declarations(类的定义)
  • Template declarations(模板声明)
  • Inline functions(内联函数)
/tmp/cckdA59Z.o: In function `nonInlineDemo()':
mycode.cpp:(.text+0x0): multiple definition of `nonInlineDemo()'
/tmp/ccY1XF2V.o:main.cpp:(.text+0x0): first defined here
collect2: error:  exit status

可以把structure的声明放到头文件中,是因为它们不会创建变量,而是告诉编译器如何创建一个structure变量。

模板声明也不是可编译的代码,而是告诉编译器如何去生成匹配的函数定义。

const声明和内联函数有特殊的连接属性,使它们可以放在头文件中而不会有啥问题。

#include时对<>和""的区别

<>会让编译器去标准头文件的目录中找。

""会让编译器去工作目录或者源代码目录中找。

不要用#include去包含源文件,这样会导致多重定义

头文件管理

在一个文件中,头文件应该只被引入一次。为什么只能引入一次?

如果你的头文件中包含了structure定义,而你的源文件又多次引入了这个头文件,会导致编译器错误。

看起来简单实际很难避免。

比如a.h和b.h都要include到源文件中,但是b.h也include了a.h,导致源文件include了2次a.h。

解决方法就是:

#ifndef XXX_H_
#define XXX_H_
// 头文件内容
#endif

C++标准中用translation unit而不是file来描述separation compilation。

Storage Duration, Scope, and Linkage

C++种的数据分为三种类型(在C++11中则是四种),这三种类型的区别在于其中的数据可以保存多久。

  • 自动存储——在函数中声明的变量(包括函数的参数)。当程序执行进入到函数中或者代码块中的时候它们被定义;离开函数或则代码块的时候它们占用的内存空间就会被释放掉。C++有两种自动存储的变量。
  • 静态存储——在函数之外定义的变量或者用关键字static定义的变量是静态存储。这些变量在程序运行的整个期间都会存在。C++有三种静态存储的变量。
  • 线程存储(C++11)——用thread_local关键字声明的变量会一直存在,直到包含它的线程死亡变量才会被释放。
  • 动态存储——通过new关键字分配的内存直到用delete操作才会被释放或者直到程序结束。

接下来要学习的是:域(scope),可见性(visible)和连接(linkage)。

域(scope)和连接(linkage)

Scope使用来描述在一个文件(或者translation unit)中,一个名称的可见性的范围大小。

比如,在函数中定义的变量只能在这个函数中使用,而不是其他的任何地方;然而在函数之外定义的一个变量名则可以在所有的函数中使用。

Linkage一个名称可以被多少编译单元所共享。

一个external linkage的名称可以被所有的文件所共享,而一个internal linkage的变量则只能

Memory Models And Namespaces的更多相关文章

  1. System and method for parallel execution of memory transactions using multiple memory models, including SSO, TSO, PSO and RMO

    A data processor supports the use of multiple memory models by computer programs. At a device extern ...

  2. 内存模型(memory models)和命名空间(namespace)

    继续<C++ premier plus > 先来解释一下scope和linkage,所谓scope,是指变量的作用范围,所谓linkage,是指变量能否在不同文件中共享 1,自动变量(au ...

  3. memory consistency

    目前的计算机系统中,都是shared memory结构,提供统一的控制接口给软件, shared memory结构中,为了memory correctness,可以将问题分为:memory consi ...

  4. Method and apparatus for providing total and partial store ordering for a memory in multi-processor system

    An improved memory model and implementation is disclosed. The memory model includes a Total Store Or ...

  5. Django 之models进阶操作

    到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 ...

  6. Synthesis of memory barriers

    A framework is provided for automatic inference of memory fences in concurrent programs. A method is ...

  7. [翻译]内存一致性模型 --- memory consistency model

    I will just give the analogy with which I understand memory consistency models (or memory models, fo ...

  8. Memory Barriers Are Like Source Control Operations

    From:   http://preshing.com/20120710/memory-barriers-are-like-source-control-operations/ If you use ...

  9. 内存模型与c++中的memory order

    概 c++的atomic使用总会配合各种各样的memory order进行使用,memory order控制了执行结果在多核中的可见顺序,,这个可见顺序与代码序不一定一致(第一句代码执行完成的结果不一 ...

随机推荐

  1. golang学习笔记 ---TCMalloc

    图解 TCMalloc 前言 TCMalloc 是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配.它具有现代化内存分配器的基本特征:对抗 ...

  2. shell脚本监控cpu/内存使用率 转

    该脚本检测cpu和内存的使用情况,只需要调整memorySetting.cpuSetting.userEmail要发邮件报警的email地址即可 如果没有配置发邮件参数的哥们,已配置了的,直接飞到代码 ...

  3. Fix Backup Database is terminating abnormally When performing a Farm Backup

    Problem I am trying to backup SharePoint 2013 Farm Automatically with PowerShell and Windows Task Sc ...

  4. Maven for Eclipse 第三章 ——创建和导入 Maven 项目

    这一章主要介绍 Maven 项目的结构,它的构建的架构,主要涵盖了必需的主题,最后将学习如何创建一个简单的 Maven 项目.这章主要包括以下部分. Maven 项目的结构 POM 文件(Projec ...

  5. Springboot使用junit

    1. 首先要下载配套的spring-boot-starter-test包,注意版本要对应. compile("org.springframework.boot:spring-boot-sta ...

  6. 王勇详谈 Linux Deepin 背后的故事

    (Linux Deepin最近发布了12.12版本.其也许是国内第一款比较优秀的桌面Linux系统.在此向致力于研发国产OS系统的猿人们表示敬意.虽然Deepin只是基于Ubuntu在桌面应用和UI方 ...

  7. 常用代码之二:使用BackgroundWorker或Task让代码异步执行。

    先要引用System.ComponentModel using System.ComponentModel; 然后创建backgroundworker private void backgroundW ...

  8. SQL作业

    USE [test] GO /****** Object: StoredProcedure [dbo].[wangchuang] Script Date: 2016/8/25 14:09:24 *** ...

  9. 常用的NodeJS模块

    图片处理 1.Manipulate images 官网:http://github.com/aheckmann/gm ImageMagick和GraphicsMagick主要用于图片的创建.编辑.合成 ...

  10. 菜鸟学Java(十五)——Java反射机制(二)

    上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...