C 中的常量 : declaration separate from definition

标签 c gcc constants

所有 C 代码:

为什么允许这样做:

int main()
{
    const int *i;
    int j=2;

    i=&j;
}

但不是这个:

int main()
{
    const int i;
    int j=2;

    i=j;
}

有没有办法声明一个局部常量变量,然后在范围内的其他地方定义它?第一种使用指针的情况是不可靠的,因为我可以多次定义它而逃脱,这首先违背了常量关键字的目的。

最佳答案

从语义上讲,第一个示例的意思是“指向 const int 的指针”而不是“指向 int 的 const 指针”。

因此,当您将 i 设置为指向 j(一个非常量整数)时。 i 现在指向一个 const,因此你不能通过指针 i 改变 j 的值,例如:

int main()
{
    const int *i;
    int j=2;

    i=&j;

    *i = 4;
}

不会编译,给出错误“只读位置‘*i’的赋值”。因此指针限制了您对所指向的值的访问。但指针本身仍然可以更改。

C 作为一种语言,并没有真正提供太多保护,您通常可以丢弃 const 并为变量分配一个新值,例如:

#include <stdio.h>

void assign(int *a) {
  *a=5;
}

int main()
{
    int const i=1;
    int j=2;
    assign((int *) &i);
    printf("i: %d\n",i);
}

但我不确定我是否会推荐它。虽然这在某些版本的 gcc 中有效,但这种行为在 C 标准中可能未定义。

关于C 中的常量 : declaration separate from definition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30688064/

相关文章:

c++ - 当我以这种方式修改交换函数时会发生什么?

c - 如何检查c代码中的内存泄漏?

gcc - 为什么 ldconfig 不链接或缓存我的库?

ios - 使用 GCC 4.2 编译的 iOS 静态库与 Xcode 4.2 中的 LLVM 兼容吗?

iphone - 根据设备类型定义常量

c++ - 在 C++ 程序中调用 Python 函数

将无符号整数转换为C中的字节数组

c++ - boost1.44.0 文件系统 v3 无法在 solaris sparc 64 位平台上正常运行

c# - 如何获得枚举数作为常量?

java - 常量接口(interface)最优雅的替代方案是什么?