C核心指南P3理想情况下,程序

文案策划招聘求职QQ群 https://www.zghy.org.cn/item/456153100791500800
1.注意事项

理想情况下,写程序要做到完全的静态(编译期)类型安全。可是,实际开发工作中,也避免不了,比如以下这些情况:

联合体(union):使用C++17的variant

类型转换(cast):减少使用,多用模板

数组衰变(arraydecay):使用GSL的span

范围错误(rangeerror):使用span

收缩转换(narrowingconversion):减少使用,使用GSL中的narrow_cast

.示例.1.联合体

variant是C++17增加的一个功能,用以作为union的安全替代。它可以保存模板参数列表中的某一类型的值。

//#includevariantvariantint,double,stringvar1{1};cout"indexis:"var1.index()endl;cout"var1isintnow:"get0(var1)endl;var1=1.;cout"indexis:"var1.index()endl;cout"var1isdoublenow:"get1(var1)endl;var1="kimi.im";cout"indexis:"var1.index()endl;cout"var1isstringnow:"get(var1)endl;indexis:0var1isintnow:1indexis:1var1isdoublenow:1.indexis:var1isstringnow:kimi.im

..数组衰变

所谓的数组衰变是指在使用数组的过程中,数组元素类型和长度信息丢失的情况。比如当我们以指针或数值的形式传递数组参数给函数的时候,数组的长度信息就丢失了。

举个例子:

voiddisplay_array_from_value(int*p){cout"以数值形式传递的数组参数,计算的内存占用值为:";coutsizeof(p)endl;}voiddisplay_array_from_pointer(int(*p)[10]){cout"以指针形式传递的数组参数,计算的内存占用值为:";coutsizeof(p)endl;}intmain(){intarr[10]={1,,};cout"数组实际占用内存空间是:";coutsizeof(arr)endl;display_array_from_value(arr);display_array_from_pointer(arr);turn0;}

数组实际占用内存空间是:40以数值形式传递的数组参数,计算的内存占用值为:8以指针形式传递的数组参数,计算的内存占用值为:8

为了避免数组衰变:

可以以指针或数值传递数组参数的同时,传一个数组长度给函数,然后不用sizeof

或者以引用形式传递数组参数

使用GSL的span

voiddisplay_array_from_value_with_size(int*p,size_tsz){cout"参数传入的内存占用值:";coutszendl;}voiddisplay_array_from_fence(int(p)[10]){cout"以数值形式传递的数组参数,计算内存占用值为:";coutsizeof(p)endl;}voiddisplay_array_from_span(gsl::spanintp){for(constautov:p){coutv"";}}intmain(){intarr[10]={1,,};cout"数组实际占用内存空间是:";coutsizeof(arr)endl;display_array_from_value_with_size(arr,sizeof(arr));display_array_from_fence(arr);display_array_from_span(arr);turn0;}

数组实际占用内存空间是:40参数传入的内存占用值:40以数值形式传递的数组参数,计算内存占用值为:

..范围错误voidaccess_out_of_range(int*p){coutp[]endl;}voidpass_span(gsl::spanintp){coutp[1]endl;}intmain(){intarr[]={1,};access_out_of_range(arr);pass_span(arr);turn0;}

.4.收缩转换

gsl::narrow在收缩转换出错的时候,会异常。

intvar1=-4;cout(unsignedint)var1endl;coutstatic_castunsignedint(var1)endl;coutgsl::narrow_castunsignedint(var1)endl;try{coutgsl::narrowunsignedint(var1)endl;}catch(gsl::narrowing_errore){coute.what()endl;}charvar=10;cout(unsignedint)varendl;coutstatic_castunsignedint(var)endl;coutgsl::narrow_castunsignedint(var)endl;try{coutgsl::narrowunsignedint(var)endl;}catch(gsl::narrowing_errore){coute.what()endl;}

std::exception

kimim


转载请注明:http://www.aierlanlan.com/rzfs/575.html