分开编译

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

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

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

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. 【转】编辑器与IDE

    编辑器与IDE 无谓的编辑器战争 很多人都喜欢争论哪个编辑器是最好的.其中最大的争论莫过于 Emacs 与 vi 之争.vi 的支持者喜欢说:“看 vi 打起字来多快,手指完全不离键盘,连方向键都可以 ...

  2. php性能优化(一)压力測试工具篇

    ab使用 Apache附带的压力測试工具ab,很easy使用,而且全然能够摸你各种条件对Webserver发起測试请求.ab能够直接在Webserver本地发起測试请求.这对于须要了解server的处 ...

  3. 大家来找茬:富连网今天中午抢购二手iPhone时网站无法访问的问题

    前几天在新闻区看到富士康卖二手iPhone的新闻,今天又看到说今天中午12点开抢.一大早就发现富连网无法访问了.前几天刚看到新闻的时候注册了个账号进去看了看,发现页面加载速度非常慢,今天中午基本无法打 ...

  4. Windows 计划任务 Task Schedule 怎么 运行 .bat文件

    1. 新建 test.bat 需要切换文件夹以后 并且执行程序. cd /D "F:\xxxfolder" && dotnet testdll.dll 2. 直接设 ...

  5. RabbitMQ 消费端 Client CPU 100%的解决办法

    Func<bool> run = () => { try { using (IConnection conn = cf.CreateConnection()) { using (IM ...

  6. linux 安装 Headless Chrome

    http://blog.csdn.net/goodzyw/article/details/77269875 https://chromedriver.storage.googleapis.com/in ...

  7. C/C++/Objective-C经典书籍推荐

    C语言要从大而全,从基础開始.它属于最好的.别被它误导.它也有非常多错误,不适合标准软件开发人员使用.变量声明,定义,编程规范全然不合规范,可是从语言学习方面做到极致,有大量不同的样例和试题.标准的教 ...

  8. HDU 1431 素数回文

    有人问我这个问题. 个人感觉暴搜会TLE O(n*sqrt(n)).n=100000000:(推断素数用2~sqrt(n)+1 去除) 还是枚举好了. 枚举 1~10000,把他每一位存下来,回文数已 ...

  9. HTML5学习笔记(十四):变量作用域

    在JavaScript中,用var申明的变量实际上是有作用域的. 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量: function foo() { var x ...

  10. Checkbox: ListView 与CheckBox 触发事件冲突的问题

    我相信很多人都遇到过 ListView 中放入checkBox ,会导致ListView的OnItemClickListener无效,这是怎么回事呢? 这是因为checkBox 的点击事件的优先级比L ...