在 macOS 上编译 C++ boost 库
Dec 26, 2024
在官网下载源码包: https://www.boost.org/users/download/ ,目前的版本是 1.87.0 解压后进入源码目录,先编译工具 b2: $ ./bootstrap.sh 然后使用 b2 编译 boost 的源码: $ sudo ./b2 install --prefix=/opt/local variant=release link=static threading=multi install 表示编译后直接安装到 --prefix 指定的目录下,手动安装可以不需要这个参数。 …
arc4random_uniform 实现一个简单的概率算法
Oct 28, 2022
arc4random_uniform 是 C 标准库中提供的随机数生成方法,定义在头文件 stdlib.h 中。 arc4random_uniform(n); 可以生成 [0, n) 的随机整数。 概率是指一个随机事件的发生几率,比如说有标号为 0 到 9 的 10 个小球,闭着眼睛随机拿出来一个,那么拿到 0 号或者 1 号的概率是 20%,因为两个球占总数量的比例就是 20%。 …
C++ 11 中的原始字符串字面量(Raw String Literal)
Oct 09, 2022
C++ 11 开始增加了 UTF-16 和 UTF-32 字符串字面量,默认的字符串字面量是 UTF8,三种编码的写法如下: // UTF-8 const char *utf8_string = "abc"; const char *utf8_string2 = u8"abc"; // UTF-16 const char16_t *utf16_string = u"abc"; // UTF-32 const char32_t *utf32_string = U"abc"; 在字符字面量中,斜杠 \ 是转义字符,需要写为 \\ 的形式才能表示一个普通的斜杠,在写正则表达式的时候就特别不方便: …
C++ 中的 MAX 和 MIN 宏
Sep 18, 2022
在学习 C 语言的时候,最先接触到的两个宏 MAX 和 MIN,用于找出两个数中较大和较小的那个值。 大多数的教程中,这两个宏的定义是这样的: #define MIN(a,b) (a) < (b) ? (a) : (b) #define MAX(a,b) (a) > (b) ? (a) : (b) a 和 b 可以是变量或者常量,也可以是表达式或者函数调用。 …
C++ 17: 结构化绑定(Structured Binding)
Aug 29, 2022
结构化绑定(Structured Binding)是 C++ 17 的新特性,是一个很方便的语法糖。 typedef struct Rect { double x; double y; double width; double height; } Rect; Rect bounds{ 100, 100, 300, 400 }; auto [ x, y, w, h ] = bounds; 以上代码中,auto [] 就是结构化绑定的语法,x, y, w, h 4 个变量名就和结构体中的字段相对应。 …
C++ 中使用 RAII 的注意事项
Aug 20, 2022
RAII (Resource Acquisition Is Initialization) 翻译为中文是「资源获取即初始化」。 通常用来做局部资源清理或者防止忘记解锁导致死锁: class LockGuard { public: LockGuard() { lock(); } ~LockGuard() { unlock(); } private: static pthread_mutex_t _fastmutex; void lock() { pthread_mutex_lock(&_fastmutex); } void unlock() { pthread_mutex_unlock(&_fastmutex); } }; pthread_mutex_t LockGuard::_fastmutex(PTHREAD_MUTEX_INITIALIZER); 以上代码定义了一个局部锁,锁生效的域和这个类的生命周期所在域一致。 …
C/C++ 中的 static 和 inline 的作用
Aug 03, 2022
static 把符号限制为 LOCAL,避免链接时同名造成冲突。 inline 把符号标识为 WEAK,如果出现多个同名则只有一个拷贝。 static inline 组合,作用和 static 一样,区别在于编译器视情况决定是否开启内联。 …
C++ 中的右值引用
Jul 08, 2022
C++ 里的表达式有左值和右值的概念。 一个表达式(expression)要么是广泛左值类型(glvalue),要么是右值类型(rvalue)。 广泛左值(glvalue),还区分为左值(lvalue)和将亡值(xvalue)。 …
C 和 C++ 中的结构体(struct)有和不同?
Jun 30, 2022
struct 是一种简单的数据结构,是把不同类型的数据聚合在一起的一种方式。 在 C 语言里,struct 数据结构具有内存连续性的特点,就是说一个结构体的所有字段在内存里存储位置是连续的。 …
C++ 中的仿函数(Functor)和匿名函数(Lambda)
Jun 27, 2022
从 C++ 11 标准开始,被称为现代 C++。其中的一个原因,就是增加了 Lambda 表达式。 仿函数 在没有 Lambda 表达式之前,如果要在局部运行一个函数,只能使用仿函数。 仿函数就是在局部定义一个类,然后重载 () 运算符: …