C中的const限定词和C ++中的const限定词有什么区别?


9

我找到了用户R.评论

C和C ++语言不同。特别地,C const与C ++无关const

我知道,constC中的const限定符和C ++中的限定符之间的区别是其默认链接。

const在C ++中,在命名空间范围内使用限定符声明的对象具有内部链接,而在C中,const在全局范围内声明带有限定符的对象(static在之前没有限定符const)具有外部链接。

但是在C和C ++语言之间,它们又有何不同?我认为两种语言在概念和目的上都具有相同的含义。

我的问题:

  • C中的const限定词和C ++中的const限定词有什么区别?

“ const”在C和C ++中有何不同的答案不要在限定词的上下文中指出C和C ++语言之间的确切差异const。只有您不能或只能使用某种语言来做。


如此多的答案仅需Google搜索即可。其中之一:stackoverflow.com/questions/4486442/...
schaiba

1
在C语言中,const与链接无关。您可以具有static const文件作用域,并且具有内部链接,
Lundin

3
如果您对该问题的当前答案不满意-与您的问题相同-请考虑在该问题上悬赏。
Sneftel

3
我同意链接的副本是错误的。一个好的答案将列出所有差异,而无需过多地解释const两种语言的相同之处。
伦丁

1
我可以尝试写出这样的答案,但我还不够用C ++专家来确保我已涵盖所有差异。我的头上:C ++中的const变量是常量表达式,与C语言不同。C++可以const限定成员函数。提到的链接。还要别的吗?
伦丁

Answers:


11
  • 最重要的区别是,在C ++中,const变量是常量表达式(甚至在引入C ++ 11之前constexpr),但const在C中,变量不是常量。

    这意味着C ++允许您执行类似操作,const size_t n = 1; static int array[n];但C不允许这样做,这可能是出于历史原因。

  • 在C ++中,const参与确定链接。这在C ++版本之间是不同的。根据cppreference.com(重点是我):

    在名称空间范围内声明的以下任何名称具有内部链接:


    • 非易失性非模板(自C ++ 14起)非内联(自C ++ 17起)未导出(自C ++ 20起)const限定变量(包括constexpr),未声明为extern且为'n'以前宣布具有外部联系;

    而在C中,const根本不参与确定链接-仅声明范围和存储类说明符很重要。

  • 在C ++中,您可以const限定成员函数。这在C语言中是不可能的,因为它不支持成员函数的语法。

  • C允许const在没有初始化程序的情况下声明-qualified变量。在C中,我们可以const int x;不使用初始化程序而编写,但是C ++不允许这样做。乍一看,这似乎是C语言中的毫无意义的语言错误,但其基本原理是计算机具有只读的硬件寄存器,其值由硬件而非软件设置。这意味着C仍然适用于与硬件相关的编程。


您可以在C中使用成员函数吗?
Maxim Egorushkin

1
请注意,const size_t n = 1; static int array[n];仅当编译器可以看到的定义n并进行恒定传播时,该选项才有效。extern const size_t n; static int array[n];不起作用。
Maxim Egorushkin

嗯,我宁愿看到这样的硬件寄存器通过指针来寻址,例如uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
阿空加瓜

@Aconcagua这将使此类寄存器与其余寄存器映射不兼容。以及如何使您在调试器中查看实际的寄存器值?例如,如果您只想查看只读硅掩膜集寄存器,以快速查看最终使用的部分。显然,您还需要volatile限定指针。
伦丁

@Lundin承认,没有注意volatile...休息取决于。在这些情况下,我手头的调试器也可以轻松解决*x。另一方面,如果将寄存器映射到某个内存区域,并且编译器不支持将变量直接放置在特定的内存位置(我已经看过两者),那么将变量获取到特定的内存位置有时会有点混乱(必须在地图文件中进行覆盖...)。最后,只要我可以完成分配给我的任务,我就不会在乎将变量放置在正确的位置;)
Aconcagua

0

来自cppreference.com

const声明未声明的非局部非易失性非模板(自C ++ 14起)非内联(自C ++ 17起)变量时使用的限定符extern为其提供了内部链接。这不同于C,在C中const文件范围变量具有外部链接。

除此之外,它们const在C和C ++ 中具有相同的语义,并且C标头const通常与带有条件的C ++标头一起编译"extern C"


1
这是一个不好的报价,过于简单。static const x;C中的文件作用域具有内部链接。C变量的链接取决于声明它的作用域以及存储类说明符的存在/不存在。const其他类型限定符根本不起作用。
伦丁

@Lundin与报价所说的有什么不同?
Maxim Egorushkin

1
我刚才给出的示例证明了引号是错误的。根据报价,static const x;C中的文件范围具有外部链接。
伦丁

@Lundin引言说,int const x = 1C中具有外部链接。因此,您需要static将链接更改为Internal。与您的评论不同,这句话对我来说很清楚。
Maxim Egorushkin

1
真的根本没有说。阅读报价。“ ... C,其中const文件范围变量具有外部链接”。
伦丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.