L'inizializzazione tra i tipi “const int** const” e “int**” non è consentita, perché?

StackOverflow https://stackoverflow.com/questions/1468148

Domanda

Utilizzando il compilatore V1.8 z/OS XL C, con avvisi potenziati utilizzando INFO(ALL), ottengo il seguente avviso sulla riga 4 del codice seguente:

WARNING CCN3196 Initialization between types "const int** const" and "int**" 
                is not allowed.


1  int foo = 0;
2  int *ptr = &foo;

3  const int * const fixed_readonly_ptr = ptr;

4  const int ** const fixed_ptr_to_readonly_ptr = &ptr;

Non riesco a capire perché ricevo questo avviso.Se posso assegnare un puntatore int a un puntatore const a const int (riga 3), allora perché non posso assegnare l'indirizzo di un puntatore int a un puntatore const a puntatore a const int?Cosa mi manca?

Tieni presente che il codice sopra è un esempio ridotto che mostra solo il problema che sto riscontrando in una piccola quantità di codice.Il vero contesto è che ho un puntatore const al puntatore a struct (struct s** const) e lo sto passando come argomento a una funzione il cui parametro è definito come puntatore const a puntatore a const struct (const struct s** cost).Questo perché la funzione non modificherà i dati nella struttura (da qui il primo const) e non modificherà il parametro del puntatore che contiene sempre l'indirizzo passato (da qui il secondo const).Il valore del puntatore puntato può essere modificato in ogni caso (motivo per cui NON c'è un terzo const tra **).

È stato utile?

Soluzione

La regola del C è che puoi convertire un puntatore a qualcosa in un puntatore a const qualcosa, ma quel qualcosa deve essere esattamente dello stesso tipo, comprese le qualifiche const e volatile più in basso nella catena.

La logica di questa regola è che se fosse consentita la seconda di queste due righe:

int *ptr;

const int ** const fixed_ptr_to_readonly_ptr = &ptr;

quindi questo può essere usato per interrompere l'sicurezza del tipo senza lanciare.

const int i = 4;

// OK, both sides have type const int *
*fixed_ptr_to_readonly_ptr = &i;

// the value of fixed_ptr_to_readonly_ptr is still &ptr
// the value of ptr is now &i;

*ptr = 5;

// oops, attempt to change the value of i which is const

Altri suggerimenti

È una violazione della sicurezza del tipo.Considera questo codice (ho mescolato const giro un po' per chiarire se si applica al puntatore o al puntatore, ma semanticamente significa esattamente la stessa cosa):

int* p = 0;
int const** pp = &p; // presumably ok

int const c = 123;
*pp = &c; // okay, &c is int const*, and *p is int const* lvalue

*p = 666; // okay, *p is int lvalue

// wait, so we just changed the value of (const) c above, with no const_cast!

Si tratta di una violazione dell'indipendenza dal tipo.Probabilmente vorrai usare invece un const int * const *.Vedere http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top