C++11添加了constexpr关键字,可以将该关键字添加到函数中以指定常量行为.

C23以[[Reducable]]标签的形式添加了看似相同的功能.

这两种机制有什么不同?

推荐答案

C++11添加了关键字constexpr,可以将其添加到函数中以指定常量行为.

C23以[[Reducable]]标签的形式添加了看似相同的功能.

这两种机制有什么不同?

一般来说,C++(或C)constexpr说明符比C[[reproducible]]属性强得多,前者具有更广泛的语义和更强的约束.此外,constexpr是程序语义的一部分,而[[reproducible]]作为属性,充当编译器可以随意使用或不使用的可选元数据.[[reproducible]]可以在不改变程序的有效性或语义的情况下自由删除,前提是没有定义[[reproducible]]的函数不是从其范围内声明带有该属性的作用域调用的.

考虑到只适用于两种语言的方面,以下是一些更多细节:

  • constexpr个函数的调用可以出现在常量表达式中,这意味着可以在编译时计算它们.前者不适用于可复制函数,并且不必在编译时计算对可复制函数的调用.

  • C++constexpr函数对其参数和返回类型有限制,而C可重现函数则没有限制.

  • 在C++的某些版本中,constexpr个函数对其定义中可以出现的语句类型(goto、标签等)有限制,而C可重复使用的函数则没有限制.

  • 在C++中,函数的定义和所有声明必须就它是否为constexpr函数达成一致.在C语言中,用reproducible属性定义的函数可以在没有它的情况下在任何翻译单元中安全地重新声明.

  • C++constexpr函数不能写入非本地对象,也不能读取大多数非本地对象.C[[Reducable]]函数不受其可以读取哪些对象的限制.可重现函数可以通过作为参数提供给它的指针写入非本地对象.

  • 每次调用带有相同参数的C++constexpr函数都必须产生相同的返回值(如果有的话),而对于具有相同参数的可重现函数的两次调用只有在一个接一个执行的情况下才需要产生相同的返回值.

总的来说,constexpr[[reproducible]]有一些大体相似之处,但它们具有非常不同的意义、效果和目的.它们离"完全相同"还差得远.另一方面,C23还将constexpr引入C,其对象的语义与C++constexpr非常相似.然而,在C中,constexpr只能应用于对象,而不能应用于函数.

C++相关问答推荐

segfault在C中使用getline()函数

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

将 typewriter LF打印到Windows终端,而不是隐含的CR+LF

编译的时候g++通常会比GCC慢很多吗?

可以将C变量限制为特定的读/写速度吗?

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

使用C时,Windows CMD中的argc参数是否包含重定向命令?

自定义变参数函数的C预处置宏和警告 suppress ?

如何在c++中包装返回空*的函数

为静态库做准备中的奇怪行为

如何按顺序将所有CSV文件数据读入 struct 数组?

为什么数组的最后一个元素丢失了?

在txt文件中找到指定的字符串,并从数字中减go 相同的值

C I/O:在Windows控制台上处理键盘输入

C:在编译时构建和使用字符串文字的预处理器宏?

递归打印二维数组(C编程)

Matlab/Octave对conv2函数使用哪种方法?

如何解释数组中的*(ptr)和*(ptr+2)?

将char*数组深度复制到 struct 中?

如何确定 C 程序中的可用堆内存