为了账号安全,请及时绑定邮箱和手机立即绑定

我应该更喜欢常量而不是定义吗?

我应该更喜欢常量而不是定义吗?

C
江户川乱折腾 2019-12-26 14:14:04
在C语言中,我是否更喜欢常量而不是定义?最近,我阅读了很多代码,所有示例都大量使用了定义。
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

不,通常,您不应该在C中使用const限定对象来创建名称常量。为了在C语言中创建命名常量,您应该使用宏(#define)或枚举。实际上,就您所暗示的意义而言,C语言没有常量。(在这方面,C与C ++明显不同)


在C语言中,常量和常量表达的概念与C ++的定义非常不同。在C中,常数表示文字值,例如123。这是C 中常量的一些示例


123

34.58

'x'

C中的常量可用于构建常量表达式。但是,由于任何类型的const限定对象都不是C中的常量,因此无法在常量表达式中使用它们,因此,您不能在需要使用常量表达式的情况下使用const限定对象。


例如,以下不是常数


const int C = 123; /* C is not a constant!!! */

并且由于上述C内容不是常量,因此不能用于在文件范围内声明数组类型


typedef int TArray[C]; /* ERROR: constant expression required */

不能用作案例标签


switch (i) {

  case C: ; /* ERROR: constant expression required */

}

不能用作位域宽度


struct S {

  int f : C; /* ERROR: constant expression required */

};

它不能用作具有静态存储持续时间的对象的初始化程序


static int i = C; /* ERROR: constant expression required */

它不能用作枚举初始化器


enum {

  E = C /* ERROR: constant expression required */

};

即它不能在需要常量的任何地方使用。


这似乎违反直觉,但这是C语言定义的方式。


这就是为什么您#define在使用的代码中看到大量的-s的原因。同样,在C语言中,const限定对象的使用非常有限。它们基本上完全没有用做“常量”,这就是为什么在C语言中,您基本上不得不使用#define或枚举来声明真正的常量。


当然,在使用const限定对象为您工作时(即它按您的意愿进行工作)的情况下,由于在范围和类型方面,它确实在许多方面优于宏。在适用的情况下,您可能应该首选此类对象,但是在一般情况下,您必须考虑上述限制。


查看完整回答
反对 回复 2019-12-26
?
慕神8447489

TA贡献1780条经验 获得超1个赞

常量比defines 更可取。有几个优点:

  • 类型安全。尽管C是弱类型语言,但是使用C会define失去所有类型安全性,这将使编译器为您解决问题。

  • 易于调试。您可以通过调试器更改常量的值,而define预处理器会在代码中自动将s更改为实际值,这意味着如果要出于测试/调试目的更改值,则需要重新编译。


查看完整回答
反对 回复 2019-12-26
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

也许我一直在错误地使用它们,但是至少在gcc中,不能在case语句中使用常量。


const int A=12;

switch (argc) {

    case A:

    break;

}


查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 583 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信