强制转换说明符的必要性

z0l*_*pka 3 c linux gcc casting const

假设我有一些这样的代码:

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

const符真正需要的投?


编辑:foo的回调具有功能特定的原型,我不能改变(这不是在我的代码)。

red*_*0ct 6

在您的特定情况下,您甚至不需要强制转换。在void * 强制转换的情况下,仅在取消引用时才需要。这样就足够了:

const struct some *azaza = ptr;
Run Code Online (Sandbox Code Playgroud)

但是为了利益,

#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;
Run Code Online (Sandbox Code Playgroud)

#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;
Run Code Online (Sandbox Code Playgroud)

总结一下:

  1. 您不需要const演员表。
  2. 如果您const仅使用强制转换(出于某种奇怪的原因._。)而没有使用-pedantic-errors-意外分配不会导致错误,这将带来很多后果。