混合extern和const

我可以混合extern和const,作为extern const ? 如果是,那么const限定符是否仅在它声明的范围内进行统治,还是应该与它声明的平移单元的声明完全匹配? 也就是说我可以声明extern const int i; 即使当实际的不是一个常量,反之亦然?

  • 是的,你可以一起使用它们。
  • 是的,它应该与其实际声明的翻译单元中的声明完全匹配。除非您参加了“ 隐藏的C程序devise竞赛” 🙂

通常的模式是:

  • file.h:
    extern const int a_global_var;
  • file.c:
    #include "file.h"
    const int a_global_var = /* some const expression */;

编辑:公司legends2k的评论。 谢谢。

你可以一起使用它们。 但是,在使用const时需要保持一致,因为当C ++进行装饰名称命名时,const被包含在用于装饰符号名称的types信息中。 所以extern const int i会引用一个不同于extern int ivariablesextern int i

除非你使用extern“C”{}。 C名字装饰不注意const。

你可以一起使用它们,你可以做各种忽略const关键字的东西,因为就是这样; 一个关键字。 它告诉编译器,你不会改变一个variables,这又会让编译器做一些有用的optomisations,并阻止你改变你不想要的东西。

Possibility.com有一个体面的文章与一些更多的背景。

是的,你可以一起使用它们。

如果你声明“extern const int i”,那么我是const的全部范围。 将其重新定义为非const是不可能的。 当然,你可以通过强制转换(使用const_cast)来绕过const标志。