在ANSI C中声明常量变量的标准是什么?

时间:2011-06-30 23:47:02

标签: c

我通过浏览我的C ++书并重新编写C中的问题来教自己C.我想知道在C中声明变量常量的正确行业标准方法。你还在使用 #define main之外的指令,还是可以在main中使用C ++样式 const int

5 个答案:

答案 0 :(得分:4)

C中的

const与C ++中的const非常不同。

在C中,这意味着不会通过该标识符修改对象:

int a = 42;
const int *b = &a;

*b = 12; /* invalid, the contents of `b` are const */
a = 12; /* ok, even though *b changed */

此外,与C ++不同,const对象不能用于,例如,在开关标签中:

const int k = 0;
switch (x) {
    case k: break; /* invalid use of const object */
}

所以......这实际上取决于你需要什么。

您的选择

  • #define:非常const但使用预处理器
  • const:不是真正的const
  • enum:仅限int

更大的例子

#define CONST 42
const int konst = 42;
enum /*unnamed*/ { fixed = 42 };

printf("%d %d %d\n", CONST, konst, fixed);

/* &CONST makes no sense */
&konst; /* can be used */
/* &fixed makes no sense */

答案 1 :(得分:1)

Modern C支持#defineconst全局变量。但是,#define s通常是真正常量的首选;这是因为#define可以被内联到它们被使用的地方,而const全局变量通常需要读取内存,特别是如果它们是在不同的翻译单元中定义的。

也就是说,复杂的常量结构对const全局变量很有用 - 字符串,struct,数组等。

答案 2 :(得分:1)

$('.cancel-update').click(function(event) { event.preventDefault(); setTimeout(function() { location.reload(); //Scroll to top and Refresh page $('html, body').animate({ scrollTop: 0 }, 'fast'); }, 5500); }); 限定的变量不视为编译时常数,它们有一个重要的局限性:const不能用于定义数组的大小。(历史原因,但不是编译器的限制,尽管如此,C ++还是纠正了这一疏忽)

您可以选择:

const int

答案 3 :(得分:0)

在大多数现代的实现中,编译器试图通过将全局const变量放在只读部分中来通过符号隐藏访问,以做更多事情。实际上,它可以保护它们在许多系统上不受更改。 例如:在Linux系统上出现段错误,在Windows上出现错误,或者在使用微控制器时将代码放在FLASH中。

这当然是100%的实现,但是很高兴知道具有内存保护硬件的现代计算机和现代编译器所做的不只是遵循标准

答案 4 :(得分:-1)

大多数C程序遵循的标准是将所有常量作为宏(#define)放在单独的头文件中。