gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:19:16 27 4
gpt4 key购买 nike

在 C 中,我应该更喜欢常量而不是定义吗?我最近阅读了很多代码,所有示例都大量使用了定义。

最佳答案

不,通常您不应该在 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 限定对象为你工作的情况下,即它做你想让它做的事,它确实在很多方面优于宏,因为它是有范围和类型的。在适用的情况下,您可能应该更喜欢此类对象,但在一般情况下,您必须考虑上述限制。

关于c - 我应该更喜欢常量而不是定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2308194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com