#开头的都是预处理器去处理的
当我们编译c++代码时,预处理器会过一遍所有你看到的语句,这个阶段基本上是一个文本编辑阶段,就像遍历我们的代码然后执行查找和替换(也可以用形参,实参和变量这些来查找和替换)(模板的工作时间在这个的后面),是纯文本替换。
#define WAIT std::cin.get();
#define KK {
int main() KK//KK就是{
WAIT //不需要;,因为上面已经有了
}
关于一些其他用法
#define Log(x) std::cout<<x<<std::endl
int main() {
Log("hello");//这里的x就是hello了
std::cin.get();
}
当然,这些用法并不怎么实用,下面会有一个真正实用的用法
首先,在debug解决方案配置下定义PR_DEBUG,对应的,在release配置下定义PR_RELEASE
然后修改代码的日志宏定义
#ifdef PR_DEBUG//即,处于debug模式下才成立
#define Log(x) std::cout<<x<<std::endl //宏定义是输出日志
#else//非debug模式是这个
#define Log(x) //宏定义是无
#endif // PR_DEBUG
int main() {
Log("hello");//这里的x就是hello了
std::cin.get();
}
这样子,就可以不修改代码还能避免发布版本会给用户看日志了
auto实际含义非常简单,是一个提示符,提示编译器根据变量的值来推导变量的类型。而这里,会主要讨论怎么使用它的问题。
int main() {
auto a = 5;
auto b = a;
std::cin.get();
}
如果你有了auto,你还需要写类型吗?能不能到处都用auto呢?
这是一个关于编程风格的问题。
比如,你使用了一个带返回值的api,如果你用auto去接受返回值,那么当某一天返回值类型改变了的时候,就不需要修改这一行代码,你甚至可能不知道返回值已经改变了。但是,它可能会破坏其他的依赖于特定类型的代码,你同意也可能不知道咋错了为什么错了(。而如果你不用auto,一方面你会因为返回值的修改而修改你的代码,但是,你不仅能知道错哪了还可能因为类型转换而不需要考虑这个问题。
总的来说,对于某些较长或较奇怪的数据类型,可交给编译器自行推导,这样使代码更简洁。另外,当你也不知道类型的时候,也可以使用auto,最后,要传引用时在后面加&,比如const auto&。
静态数组指大小不会增长的数组。
int main() {
std::array<int, 50> data;//和c语言风格的数组一样
data[0] = 2;
data.size();//可以直接访问大小
std::cin.get();
}
他并不会带太多性能开销,比如size函数,因为是模板实现,他的源代码就是返回一个直接你给的(比如50),事实上就是return 50(在这个例子里),所以基本上不会有什么性能开销。
同时,他还有许多好用的功能。
这一节讲的是原始风格的函数指针,来自于C语言。
函数指针,是将一个函数赋值给一个变量的方法。
#include<iostream>
#include<string>
void foo(std::string testStr)
{
std::cout << testStr << std::endl;
}
int main()
{
std::string testStr = "hellsassasao";
//第一种函数指针,auto来表示
auto foo1 = foo;
foo1(testStr);
//第二种,函数指针变量,其中
void(*funcsuibianqude)(std::string);
funcsuibianqude = foo;
funcsuibianqude(testStr);
//第三种,改变第二种的形式,表现得更自然一些
typedef void(*suibianqu)(std::string);
suibianqu suibian = foo;
suibian(testStr);
}
#include<iostream>
#include<vector>
void PrintValue(int value)
{
std::cout << "value: " << value << std::endl;
}
void ForEach(const std::vector<int>& values, void(*suibian)(int))
{
for (int val : values)
{
suibian(val);
}
}
int main()
{
std::vector<int> values = { 1,5,4,2,3 };
ForEach(values, PrintValue);//给函数传递函数
ForEach(values, [](int value) {std::cout << value << std::endl; });//你甚至可以
//直接传一个lambda表达式
std::cin.get();
}