搭建Typora+hexo环境
本文记录了作者如何搭建 Typora 与 Hexo 的博客环境。先说明为何放弃 Typora 的 Upload Image 功能,改用 PicGo 与 GitHub 作为图床;随后讨论将 Typora 文章迁移至 Hexo 时图片无法加载的问题,并给出通过自定义 asset_img 标签或脚本自动转换图片路径的解决方案。最后提到计划使用 Jenkins 自动化部署。
学习C++ - 不常见概念解释
模板相关1. Dependent Namehttps://en.cppreference.com/w/cpp/language/dependent_name 在涉及到模板时,如果引用模板参数中的符号,那么这个符号就是dependent name,即依赖于模板实例化才能确定符号类型。 1.1. Binding Rules不依赖模板参数的符号是在模板定义时绑定的。如果绑定时和模板实例化时,同一个符号的含义发生了变化,那程序可能会出问题。 1.2. Lookup Rules依赖模板参数的符号是在模板实例化时才去绑定的。 1.2.1. 非ADL非ADL的情况下,只会在模板定义的上下文寻找符号定义; 下面的例子中,writeObject方法的模板参数类型并不是用户命名空间中定义的,因此对应非ADL场景,只会在模板定义上下文寻找 operator << (std::ostream& os, std::vector&) 符号的定义,不会去用户命名空间中查找: 12345678910111213141516171819202122232425262728293...
学习C++ - 艰难的熟悉过程
1. using声明https://en.cppreference.com/w/cpp/language/using_declaration 自C++11开始,除了可以使用using引入命名空间所有符号外,还可以使用using来定义类型别名,以及使用using为子类引入父类定义的函数,包括构造函数; 昨天晚上读React-Native源码时,发现调用了一个类的构造函数,但是并没有找到这个构造函数的定义在哪里,找了很久才发现看漏了一行using,原来子类是通过using将父类的构造函数全部引入了进来。 如果子类使用using引入父类构造函数会有一些需要注意的点,第一个是引入时,会将父类的所有构造函数一次性的全部引入到子类,如果子类中新定义的所有成员都能进行隐式的初始化,那就可以直接使用using引入的父类构造函数方法来实例化子类实例了。 如果子类自己定义了函数,并且签名和using引入的函数的签名一样,那么using引入的函数会被隐藏。 例如: 123456789101112131415161718192021222324struct B1 { B1(int, ...) { }...
C++ Struct的使用
1. C++中的结构体在C语言中,结构体不能包含函数。 在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。 C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而class中默认是private。 C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。 struct能包含成员函数吗? 能! struct能继承吗? 能!! struct能实现多态吗? 能!!! 2. 结构体的定义与声明实例代码1: 1234567891011struct tag { member-list;}variable-list;/*注:struct为结构体关键字; tag为结构体的标志; member-list为结构体成员变量及成...
C++ stdbind的使用
1. 可调用对象可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针; C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。 不同类型可能具有相同的调用形式,如: 123456789101112// 普通函数int add(int a, int b){return a+b;} // lambda表达式auto mod = [](int a, int b){ return a % b;}// 函数对象类struct divide{ int operator()(int denominator, int divisor){ return denominator/divisor; }}; 上述三种可调用对象虽然类型不同,但是共享了一种调用形式:...
C++ bind的使用
1. 可调用对象可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型; 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针; C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。 不同类型可能具有相同的调用形式,如: 123456789101112// 普通函数int add(int a, int b){return a+b;} // lambda表达式auto mod = [](int a, int b){ return a % b;}// 函数对象类struct divide{ int operator()(int denominator, int divisor){ return denominator/divisor; }}; 上述三种可调用对象虽然类型不同,但是共享了一种调用形式:...
深入理解C++11
1. 前言1.1. 说到C++11,应该想到什么? 什么是 lambda,及怎么样使用它是最好的? decltype 和 auto 类型推导有什么关系? 什么是移动语义,以及(右值引用)是如何解决转发问题的? default/deleted 函数以及 override 是怎么回事? 异常描述符被什么替代了? noexcept 是如何工作的? 什么是原子类型以及新的内存模型? 如何在 C++11 中做并行编程? 1.2. 语言的哪些关键字和C++11有关? alignas alignof decltype auto(重新定义) static_assert using(重新定义) noexcept export(弃用,不过未来可能留作他用) nullptr constexpr thread_local 2. 保证稳定性和兼容性2.1. 将C99标准纳入C++112.1.1. 确定编译环境的预定义宏 STDC_HOSTED:编译器的目标系统环境中是否包含完整的C库 STDC:编译器对于标准C库的实现是否和C标准一致(是否定义、如何定义由编译器决定) STDC_VERSI...
C++ Primer Plus笔记
1. 预备知识1.1. 如何运行C++程序 使用文本编辑器编写程序,保存文件,这个文件就是源代码。 编译源代码。运行程序将源代码翻译为机器语言。翻译后的文件就是目标代码。 将目标代码与其他代码链接起来,生成程序的运行阶段版本。最终产品文件为可执行代码。 链接指的是将目标代码同使用的函数的目标代码以及一些标准的启动代码组合起来,生成程序的运行阶段版本 编程步骤如下图: 从4.2版起,g++要求编译源代码文件时使用标记-std=c++0x: g++ -std=C++11 use_auto.cpp 2. 开始学习C++2.1. 为什么main()不能使用其他名称?C++程序必须包含一个名为main()的函数, 这是由系统的C++运行时决定的。编译器生成目标系统的可执行文件时,操作系统的启动入口就是C++运行时,然后运行时完成初始化之后就会调用main函数(入口点)。 存在一些例外情况:比如windows上编写DLL模块,是因为DLL模块不是独立的程序。 2.2. cin不支持录入空格在C++中,用cin>>str;这种方法来接收字符串那么录入的s...
C语言宏的特殊用法和几个坑
总结一下C语言中宏的一些特殊用法和几个容易踩的坑。由于本文主要参考GCC文档,某些细节(如宏参数中的空格是否处理之类)在别的编译器可能有细微差别,请参考相应文档。 1. 宏基础宏仅仅是在C预处理阶段的一种文本替换工具,编译完之后对二进制代码不可见。基本用法如下: 1.1. 标示符别名1#define BUFFER_SIZE 1024 预处理阶段,foo = (char *) malloc (BUFFER_SIZE);会被替换成foo = (char *) malloc (1024); 宏体换行需要在行末加反斜杠\ 123#define NUMBERS 1, \ 2, \ 3 预处理阶段int x[] = { NUMBERS };会被扩展成int x[] = { 1, 2, 3 }; 1.2. 宏函数宏名之后带括号的宏被认为是宏函数。用法和普通函数一样,只不过在预处理阶段,宏函数会被展开。优点是没有普通函数保存寄存器和参数传递的开销,展开后的代码有利于CPU cache的利用和指令预测,速度快。缺点是可执行代码体...
《明解C语言》读书笔记
1. 第一章 初识C语言1.1. 转义字符1.1.1. 响铃🔔: \a 12345678#include <stdio.h>int main(void){ char *name = "Evan"; printf("Hello, %s!\a\a\a\n", name); return 0;} 1.2. 通过键盘输入和显示1.2.1. scanf123456789#include <stdio.h>int main(int argc, const char * argv[]) { int number; printf("Please input a number: \n"); scanf("%d", &number); printf("Your number is %d\n", number); return 0;} 1.2.2. puts 123456789101112#include <stdio.h>int main(int argc, const char *...



