网站定制开发注意事项,做网站的前端是做什么,物业管理系统需求分析,精美网页一、c23新的属性
在前面的分析中说过#xff0c;各种语言的发展整体思路是一致的#xff0c;即朝着更加实用、简单和更接近自然语言的方向在前进。c23中也在不断的完善和增加相关开发的一些属性和预编译处理指令#xff0c;这样就可以让开发者在开发的过程中对程序进行控制…一、c23新的属性
在前面的分析中说过各种语言的发展整体思路是一致的即朝着更加实用、简单和更接近自然语言的方向在前进。c23中也在不断的完善和增加相关开发的一些属性和预编译处理指令这样就可以让开发者在开发的过程中对程序进行控制而不必非得等到运行时才能预判到结果。 在c11后c14c17c20都有新的属性Java叫注解的引入所以c23也要引入一些这也算是传统了。 在c23中引入了assume属性并且在lambda表达式中也新增了属性的支持。
二、作用和例程
一个生态体系的架构不是一朝一夕完成的。同样c标准的完善和迭代也是一个冗长的过程。一个新标准的加入不管是语言层次还是库层次一定有一个需求发展的过程。可能在早期这个功能需求并不强烈而且可能有一些不完善但随着技术的发展和提出的草案越来越全面这种功能加入到新标准就会可能性越来越大。这个在c11到c23中都有很多例子可以说出来。 今天介绍的这几个新功能就是在这种情况下引入的。 1、lambda表达式新增属性支持 在c语法中lambda往往代表着一些普通的语法无法在其中使用比如早期的模板和auto等。但这些都在后期慢慢补齐了。而属性的出现同样需要在lambda表达式中有应用的需求
auto func [] [[nodiscard]] ()-std::string { return 123; };即使是如此仍然有一些属性在lambda表达式中的应用还是会受到受制比如[[noreturn]]。另外由于宏生成代码的特殊性新标准对重复属性定义取消了限制的情况
// 不可以
[[nodiscard, nodiscard]] int get()
{return 0;
}// 可以
[[nodiscard]][[nodiscard]] int get()
{return 0;
}
反正是能支持的尽量支持有点过分的暂时不支持以后支持不支持不好说。
2、assume 这个属性的功能其实在许多平台的编译器的扩展中早就进行了支持它的意思是如果在编译期某个条件必然成立后就可以停止对整体范围内的错误检查。这句话有点不太顺溜看下代码就明白了
double get(double x)
{//必须要做x !0的判断if (x 0){return 100.00/x;}
}
double get(double x)
{[[assume(x 0)]]return 100.00/x;
}
就如上面的代码一般来说当进行除法运算时一定要检查除数是否为0但是assume确定其大于0后就不需要再做其进行判断了。这和constexptr if有相似的地方。
三、总结
c23的新功能基本就要介绍完了其中一些代码由于无法运行可能会存在着一些错误。这些大家都可以先明白标准提出的目的。也欢迎大家提出各种批评和意见大家共同进步。真理越辩越明技术越讨论就明晰。 等到各大平台的编译器基本支持c23的主流功能后这些新功能才有可能应用到实际的工程中去。现在很多公司都在升级c标准至少c17主流的编译器目前都已经进行了支持所以新的标准不断的在新项目中采用大家还是有序跟进不要掉队。