哈尔滨网站建站模板,ps 如何做网站,遂昌赶街网站,呼市网站优化内联函数声明和定义不能分开 inline不建议声明和定义分离#xff0c;分离会导致链接错误。因为inline被展开#xff0c;就没有函数地址 了#xff0c;链接就会找不到。
auto关键字
随着程序越来越复杂#xff0c;程序中用到的类型也越来越复杂#xff0c;经常体现在分离会导致链接错误。因为inline被展开就没有函数地址 了链接就会找不到。
auto关键字
随着程序越来越复杂程序中用到的类型也越来越复杂经常体现在
类型难于拼写含义不明确导致容易出错 我们可以想到可以通过typedef给类型取别名使用typedef给类型取别名确实可以简化代码但是typedef有会遇到新的难题
#include iostreamusing namespace std;
typedef char* pstring;int main(){const pstring p1; // 编译成功还是失败const pstring* p2; // 编译成功还是失败return 0;}在编程时常常需要把表达式的值赋值给变量这就要求在声明变量的时候清楚地知道表达式的 类型。然而有时候要做到这点并非那么容易因此C11给auto赋予了新的含义。
#include iostreamusing namespace std;
typedef char* pstring;int main(){const pstring p1nullptr; // 编译成功还是失败const pstring* p2; // 编译成功还是失败return 0;}auto可以自动推断出变量的类型
#include iostreamusing namespace std;
int main()
{int a 5;auto b a;auto c a;cout typeid(b).name() endl;cout typeid(c).name() endl;}在c中使用这个typeid(变量名).name()会知道变量类型 【注意】 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编 译期会将auto替换为变量实际的类型。
#include iostreamusing namespace std;
int main()
{int a 5;auto c a;auto* d a;cout typeid(c).name() endl;cout typeid(d).name() endl;}auto后面加一个*是说明d变量是个指针类型.
在同一行定义多个变量 当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译 器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。
void main()
{auto a 1, b 2; auto c 3, d 4.0; // 该行代码会编译失败因为c和d的初始化表达式类型不同
}基于范围的for循环
#include iostreamusing namespace std;
int main()
{int arr[] { 5,4,9,6,3,1,8,7,5 };for (int i 0; i sizeof(arr) / sizeof(arr[0]); i){cout arr[i] endl;}}如果使用语法糖的话
#include iostreamusing namespace std;
int main()
{int arr[] { 5,4,9,6,3,1,8,7,5 };for (auto a : arr){cout a ;}}
这样会方便很多.目前只适用于数组
指针空值nullptr
#include iostreamusing namespace std;
void f(int)
{cout f(int) endl;
}
void f(int*)
{cout f(int*) endl;
}
int main()
{f(0);f(NULL);return 0;
}NULL实际是一个宏在传统的C头文件(stddef.h)中可以看到如下代码
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif可以看到NULL可能被定义为字面常量0或者被定义为无类型指针(void*)的常量。 对于上面两个重载函数都会被认为调用的是第一个函数
#include iostreamusing namespace std;
void f(int)
{cout f(int) endl;
}
void f(int*)
{cout f(int*) endl;
}
int main()
{f(0);f(nullptr);return 0;
}程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的 初衷相悖。
注意
在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入 的。在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。