从宿主访问Ubuntu虚拟机的文件

背景: 开发中希望能从宿主直接访问虚拟机的文件,例如用office打开word,用 source insight 阅读代码等。

  • 虚拟机为16.04 ,宿主为Windows 10 1803,samba试了很多次,就是不行。

  • ftp方案:

  1. sudo apt-get install vsftpd
  2. sudo vi /etc/vsftpd.conf,并在末尾粘贴以下内容
anonymous_enable=YES
anon_root= abs_path_to_dir
Read More

[Cpp基础] [07] 复杂类型和类型推断

数组类型和函数类型

尽管在大部分场合中,数组类型和函数类型都被转换成某种指针使用,然而它们确实是某种类型.
这一点在类型推导中很重要,因为类型推导可以推导出数组类型/函数类型

  • T[N]型对象为数组类型,其中N必须为constexpr,称T array[N]中的arrayT[N]型的一个实例.
    • N是数组的一个属性,当N不同时,是不同类型的数组.
  • 数组类型变量可以被隐式转换为指向数组首元素的指针.
Read More

[Cpp基础] [06] 强制类型转换

强制类型转换

  • C++风格的类型转换为四个xxx_cast<TYPE>(var),每个都有特定的应用场合.
  • 转换总是通过创建临时量实现的,相当于TYPE tmp(var). 转换语句整体为tmp
  • 规定:仅有xxx_cast<TYPE &>(var)得到的临时量可以作为左值,其他情况都是右值。

const_cast

  • const_cast是只用于处理const
Read More

[Cpp基础] [05] const与constexpr

const限定符

  • const是一种编译期特性,用于限定对象的编译期写入权限
    • 换言之,其实可以通过各种trick在运行期写入对象.
    • 当项目很大,或者开发人员很多时,使用const就能利用编译器约束开发人员的行为,给开发人员做一定提醒.
    • const值往往还可以供编译器进行优化.
  • 原则上,当我们创建一个变量时,若认为它不应当被修改,就应当声明称const型.最常用的场合是函数形参/返回值中的const T
Read More

[Cpp基础] [04] 名字查找与函数重载

名字

  • 在C++中,有各种各样的名字,变量名和函数名(可调用对象名)是最重要的两个
  • 命名空间:形如namespace XX{}的作用域.
    • 我们的代码默认都位于全局空间内,该空间直接通过::访问
    • 可以定义匿名的namespace,其效果和inline命名空间类似,匿名的namespace是文件私有的,在文件内部共享,在文件之间独立.在C++中,该特性设计用于替代C风格的全局static型变量.
  • 作用域:用{}分割的各种区域都是作用域,常见的如class,namespace,函数体,代码块等.作用域是可以嵌套的.
  • 嵌套的命名空间需要注意名字隐藏的问题,例如,对于namespace A{#include <vector>}
    • 相当于在::A内定义了一个
Read More

[Cpp基础] [03] 变量声明-定义及初始化

变量的"声明,定义"以及"初始化"

想要彻底理解这一部分的内容,你应该对OS/进程/虚拟内存/编译过程有一定的了解,仅从语言层次学习是比较抽象的.

声明和定义

  • 从编译的角度看:
    • 仅声明某个变量,那么就只创建了符号,这个符号不必分配存储空间,其具体地址需要在链接期resolve
    • 定义某个变量,在创建符号的同时,编译器为其分配了存储空间,符号地址在编译期就已经基本确定(后续可能会有重定位).
  • 对开发者而言:
    • 如果你希望使用某个已经存在的对象,那么就应该使用声明语句.
    • 每个定义语句都有"声明"的效果,不存在只定义不声明的语句.
  • 就C++而言,若语句仅有extern,且不含任何初始化部分,则该语句就是一个纯粹的声明,例如
    • extern T &val;//纯声明
    • extern T val;//纯声明
    • extern T
Read More

[Cpp基础] [02] 拷贝/移动与引用

这一部分主要介绍左值,右值,引用,拷贝和移动.这些可以说是C++11显著区别于以前的C++(还有C)的特性.本文主要从易用的角度介绍值类型(值类型实际要更多一些).

经验谈: 除非"移动"能带来特别明显的性能优势,所有"支持拷贝的自定义类"都应该把移动操作设为=delete的.一方面并不是所有人都熟悉移动语义,另一方面,移动语义可能会引入许多bug. 综上,要么类实例是只能拷贝的,要么是只能移动的.

拷贝与移动的基本定义

  • "拷贝"和"移动"是从逻辑层面定义的,物理层面只有"拷贝",没有"移动"操作.
  • 对于自定义类,拷贝与移动的实现有基本的准则(非硬性),这些准则是:

    • 拷贝:不应对源对象做任何修改.
    • 移动:可以对源对象做修改,但是源对象被修改后必须可以被赋值,且可以安全的析构.
  • 注意,对于移动操作.我们不能对移出后剩余的部分做任何假定,在没有重新赋值前,不能使用剩下的对象
    • 例如:对一个vector<int> a;,其中的所有元素都被移出后,不能假定a.size()值为0了.
  • 一般而言:
    • 对于涉及资源的类型(如vector),我们一般认为,移动操作的性能开销应该优于拷贝.
Read More

[Cpp基础] [01] Cpp编译系统基础

编译系统基础

工具链

  • 一个典型的工具链是:链接器-编译器(汇编器一般不接触)-预处理器-文本编辑器-构建系统
    • 调试工具及profile工具通常作为独立的部分出现.
  • 构建系统,或者称为工程管理器,对于开发意义重大,是工具链中重要的一环,其意义在于组织文件,管理源代码,明确目标输出,组织编译/链接的顺序和关系.
    • 常见的构建系统有,VS的nmake,QT的qmake,跨平台的CMAKE(使用makelist.txt),unix平台的make(使用makefile)
    • VS和QT这样的IDE,由于需要进行一些额外的处理,还自定了更高级的工程文件格式.vxproj.pro
  • 头文件应当尽可能的避免重复#include
Read More

字符集与编码

近义名词

  • 多字节字符(Multibyte char) ~ 变长编码, 一个字符可能由多个字节(字节数不定)表示, 因此每个需要按一定规则添加额外的信息,以分割字符.
  • 宽字节字符(Wide char) ~ 定长编码, 使用定长的字节表示字符,因此字符之间没有额外的分割信息.

字符绘制基础

  • 假设有函数drawChar(charSet,code_point), drawChar将根据(charSet,code_point)两个参数在
Read More