1.为了支持底层编程,C++定义了一些固有的不可移植的特性,所谓不可移植特性是指因机器而异的特性。

2.一个位域中含有一定数量的二进制位,位域在内存中的布局是机器相关的。位域的类型必须是整型或枚举类型,因为带符号位位域的行为是由具体实现确定的,所以在通常情况下我们使用无符号类型保存一个位域。

typedef unsigned int Bit;
class test
{
Bit A : ; // A占2位
Bit B : ; // B占1位
Bit C : ; // C占3位
};

如果可能的话,在类的内部连续定义的位域压缩在同一整数的相邻位,从而提供存储压缩。这些是与机器相关的。

3.取地址运算符不能作用于位域,因此任何指针都无法指向类的位域。

4.访问位域的方式:

typedef unsigned int Bit;
class test
{
public:
Bit A : ; // A占2位
Bit B : ; // B占1位
Bit C : ; // C占3位
}; test t; t.A |= 0xFF; // A=3
t.B = ; // B=1
t.C &= 0x00; // C=0

5.volatile表示对象的值可能在程序的控制或检测之外被改变,并告诉编译器不应该对这样的对象进行优化。voilatile起到对类型额外修饰的作用。

class test{};

volatile int i;            // 该int值可能发生改变
volatile int* p; // p指向一个volatile对象
volatile int arr[]; // arr的每个元素都是volatile
volatile test t; // t的每个成员都是volatile

6.const和volatile限定符互相没什么影响,某种类型可能既是const的也是volatile的,此时它同时具有二者的属性。

7.就像一个类可以定义const成员函数一样,它也可以将成员函数定义成volatile的,只有volatile的成员函数才能被volatile的对象调用。

8.和const一样,我们只能将一个volatile对象的地址赋值给一个指向volatile的指针,只有当某个引用是volatile的时,我们才能使用一个volatile对象初始化该引用。

volatile int i;                // i是一个volatile int
int *volatile ip; // ip是一个volatile指针,指向int
volatile int* p; // p是一个指针,指向volatile int
volatile int *volatile vp; // vp是一个volatile指针,它指向一个volatile int int *p1 = &i; // 错误,必须使用只想volatile的指针
p = &i; // 正确
vp = &v; // 正确

9.const和volatile的一个重要区别是我们不能使用合成的拷贝/移动构造函数及赋值运算符初始化volatile对象或从volatile对象赋值。因为合成的成员接受的形参是非volatile常量引用,显然我们不能把一个非volatile引用绑定到一个volatile对象上。

10.C++ 使用链接指示指出任意非C++函数所用的语言。想要把C++代码和其他语言编写的代码放在一起使用,要求我们必须有权访问该语言的编译器,并且这个编译器与当前的C++编译器是兼容的。

11.链接指示不能出现在类定义或函数定义的内部。同样的链接指示必须在函数的每个声明中都出现。

extern "C" size_t strlen(const char*);    // 单语句链接指示

extern "C"    // 复合语句链接指示
{
int strcmp(const char&, const char*);
char *strcat(char*, const char*);
}

12.多重声明的形式可以应用于整个头文件。头文件中所有普通函数声明都被认为是由链接指示的语言编写的,链接指示可以嵌套,因此如果头文件包含自带链接指示的函数,则该函数的链接不受影响。

extern "C"
{
#include <string.h>
}

13.当我们使用链接指示时,它不仅对函数有效,而且对作为返回类型或形参类型的函数指针也有效。

// func是一个C函数,它的形参是一个指向C函数的指针
extern "C" void func(void(*)(int));

14.因为链接指示同时作用于声明语句中的所有函数,所以如果我们希望给C++传入一个指向C函数的指针,则必须使用类型别别名。

extern "C"    typedef void func(int);
void f(func *);

15.通过使用链接指示对函数进行定义,我们可以令一个C++函数在其它语言编写的程序中可用。但是要注意类型限制。

extern "C"    int add(int) {}        // add 函数可以被C程序调用

16.有时候需要在C和C++中编译同一个源文件,我们可以使用预处理定义__cplusplus。

#ifdef __cplusplus
extern "C"
#endif
int strcmp(const char*, const char*);

17.链接指示与重载函数的相互作用依赖于目标语言。如果目标语言支持重载函数,则为该语言实现链接指示的编译器很可能也支持重载这些C++的函数。如果在一组重载函数中有一个是C函数,则其余的必定都是C++函数。

C++ Primer 笔记——固有的不可移植的特性的更多相关文章

  1. C++ Primer笔记

    C++ Primer笔记 ch2 变量和基本类型 声明 extern int i; extern int i = 3.14;//定义 左值引用(绑定零一变量初始值,别名) 不能定义引用的引用:引用必须 ...

  2. JavaSE学习笔记(3)---面向对象三大特性

    JavaSE学习笔记(3)---面向对象三大特性 面向对象的三大特征:继承.封装.多态 1.封装 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改.然 ...

  3. C++ Primer 笔记(1)基础中的战斗机 输入输出 对输入不定数据处理

    今天打算再重新好好的看一遍C++ Primer这本很经典的书籍,笔记开始: 1.每个C++程序都包含一个或者多个函数,其中必须有一个main,操作系统通过调用main入手运行程序: 2.函数包括:返回 ...

  4. AM335x(TQ335x)学习笔记——GPIO关键驱动移植

    或按照S5PV210学习秩序.我们首先解决的关键问题.TQ335x有六个用户按钮,每个上.下.剩下.对.Enter和ESC. 我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏 ...

  5. C++ Primer 笔记 第一章

    C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...

  6. AM335x(TQ335x)学习笔记——GPIO按键驱动移植

    还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...

  7. C++primer笔记之顺序容器

    最近又重新拾起C++primer,发现每一次看都会有不同的体验,但每一次看后因为不常用,忘记得很快,所以记笔记是很关键的一环,咋一看是浪费时间,实际上是节省了很多时间.下面就把这一节的内容做一个简单的 ...

  8. c++ primer 笔记 (一)

    昨天开始看的<C++ Primer>,确实不错.希望这周抓紧看完,每天做下笔记,以便以后复习. main函数返回一个值给操作系统   操作系统通过main函数返回的值来确定程序是否成功执行 ...

  9. cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

随机推荐

  1. Hadoop Steaming开发之WordCount

    简单的WordCount栗子--类似于编程语言中的hello world 1.shell脚本run.sh HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bi ...

  2. 记录linux 命令

    1.du:查询文件或文件夹的磁盘使用空间 如果当前目录下文件和文件夹很多,使用不带参数du的命令,可以循环列出所有文件和文件夹所使用的空间.这对查看究竟是那个地方过大是不利的,所以得指定深入目录的层数 ...

  3. 理解OAuth 2.0(转)

      OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料 ...

  4. DNS解析出现错误故障解决

    当DNS解析出现错误,例如把一个域名解析成一个错误的IP地址,或者根本不知道某个域名对应的IP地址是什么时,就无法通过域名访问相应的站点了,这就是DNS解析故障.出现DNS解析故障最大的症状就是访问站 ...

  5. MinGW GCC 6.3.0 2017年3月份出炉啦

    MSYS_MinGW-w64_GCC_630_x86-x64_Full 发布日期: 2017-03-07 08:48 68264 KB 下载地址: http://xhmikosr.1f0.de/too ...

  6. Sublime Text3 C++ 设置

    系统环境: 首先是 C++ 的环境设置, 先下载 CodeBlocks, 安装目录下有 MinGW, 直接复制到 C 盘下, 再在电脑中添加 环境变量(PATH). Sublime Text3 设置: ...

  7. 前端 ---BOM的介绍

    BOM的介绍 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象模型,操作网页上的 ...

  8. [转]MingGW64 多个版本区别(silj, seh)

    1 引言 在https://sourceforge.net/projects/mingw-w64上会看到MinGW有各种版本如下,但区别在于哪儿呢 MinGW-W64 GCC-8.1.0 x86_64 ...

  9. HashMap遍历的两种方式,推荐使用entrySet()

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) {    ...

  10. windows 2012执行powershell脚本报错

    使用powershell运行脚本报错:进行数字签名.无法在当前系统上运行该脚本.有关运行脚本和设置执行策略的详细信息 修复方法:powershell "Set-ExecutionPolicy ...