#学习自用#
宏
当我们编译C++文件时,首先预处理器会过一遍所有带# 的语句(预编译指令符号),然后进行文本替换。
#include<iostream>
using namespace std;
#define SQUARE(X) X*Xint main()
{int a = SQUARE(5);cout << a << endl;int b = SQUARE(2 + 3);cout << b << endl;cin.get();
}
这里写了一个宏来实现数的平方,注意X是参数符号标记并不是真正的传参,宏虽然看起来像函数但并不是传递参数来实现的,只是简单的文本替换,b=2+3*2+3,所以a,b的结果不相同。
宏并不适合拿来写函数,容易发生一些不容易察觉的错误,比如上面代码中b的结果,更麻烦的是宏是在预处理阶段进行的文本替换,并不能添加断点调试,这就导致宏引发的错误更难以发现。
在宏定义中不一定所有语句都得写在同一行,可以使用 \来实现多行的书写。反斜杠后面一定不能有空格!!!(有空格就是对空格的转义而不是对换行的)
auto
#include<iostream>
int main()
{auto a = 5;auto b = "odd";auto c =5.0f ;cin.get();
}
从这段代码可以看出,我们不需要特别关注类型,auto可以让变量自动对应上其赋值的类型。当变量类型比较简单时用auto会导致代码可读性下降,所以auto一般都运用在类型名过长(无须映射)和不知道类型的情景下。
array
array是静态数组,与vector不同array不能改变设定的元素个数,语法为 std::array<类型,元素个数>数组名,可以像访问数组那样访问它,array与c语言中的数组差别不大,都是储存在栈上。
#include<iostream>
#include<string>
#include<array>
using namespace std;
int main()
{array<int, 5>data;data[0] = 0;int dataold[5];dataold[0] = 0;cin.get();
}
相比于c风格的数组,array增加了一层调试,可检查数组是否越界,可记录数组大小,没有性能损失。