c - const 说明符在 cast 中的必要性

标签 c linux gcc casting constants

假设我有这样的代码:

void foo (void *ptr) {
    const struct some *azaza = (const struct some *)ptr;
    azaza->some_field = 123; // inadvertently assignment => error
    // ...

转换中真的需要 const 说明符吗?


编辑:foo 是具有特定原型(prototype)回调 函数,我无法更改(它不是在我的代码中)。

最佳答案

在您的特定情况下,您甚至不需要强制转换。如果是 void * 只有在取消引用时才需要转换。所以这样做就足够了:

const struct some *azaza = ptr;

但是为了兴趣,

#gcc test.c:

// 1)
const struct some *azaza = ptr;
azaza->some_field = 123; // error: assignment in read-only object

// 2)
struct some *azaza = (const struct some *)ptr; // (!)warning: initialization discards ‘const’ qualifier

azaza->some_field = 123;

#gcc test.c -pedantic-errors:

// 1)
const struct some *azaza = ptr;
azaza->some_field = 123; // error: assignment in read-only object

// 2)
struct some *azaza = (const struct some *)ptr; // error: initialization
                                               // discards ‘const’ qualifier

azaza->some_field = 123;

总结:

  1. 在转换中不需要const
  2. 如果您仅在转换中使用 const(出于某些奇怪的原因 ._.)并且没有 -pedantic-errors - 意外赋值不会导致充满后果的错误。

关于c - const 说明符在 cast 中的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398708/

相关文章:

linux - Bash 脚本来检测我的 USB 何时插入,然后将其与目录同步

linux - 内核态上下文切换时如何保持原子性?

c++ - 将单个 float 移动到 xmm 寄存器

c - Linux内核3. *系列在通过make-kpkg和gcc-4.8.5在Ubuntu 16.04.1中自定义编译后无法正常启动。

无法理解这种计算数字平方的方式

c - 汇编中 C 的数组

c++ - 在 MathGL 中使用 mglData 导致段错误

gcc - 如何在 ubuntu 上安装新版本的 gcc

c - 将-1、0或1随机添加到C中的数字

将 C 代码转换为 MASM32