2016-01-18 17 views
8

Stavo guardando un esempio che mostrava il motivo per cui digitare un puntatore è una cattiva pratica. La parte che non ho capito sull'esempio è che il compilatore non è stato in grado di cogliere il problema. Ho elaborato l'esempio nella seguente codice:typedef'ng un puntatore e const

#include <stdio.h> 

typedef int *TYPE; 

void set_type(TYPE t) { 
    *t = 12; 
} 

void foo(const TYPE mytype) { 
    set_type(mytype); // Error expected, but in fact compiles 
} 

int main() { 
    TYPE a; 
    int b = 10; 
    a = &b; 
    printf("A is %d\n",*a); 
    foo(a); 
    printf("A is %d\n",*a); 

    return 0; 
} 

Così, ero in grado di cambiare il valore di a. Anche se, l'esempio ha spiegato che dovresti fare, typedef const int *TYPE, per risolvere il problema, non capisco perché il compilatore non è stato in grado di rilevare l'errore quando sto impostando TYPE to be const nell'argomento della funzione stessa. Sono sicuro che mi manca qualcosa di molto semplice.

+2

Risposta, NON. 'typedef'ing un puntatore causerà più problemi rispetto ai benefici di" * sintassi sugar * ". –

+0

Sono sicuro che hai ragione, ma mi dispiace, non era la risposta che stavo cercando. –

+1

Il tuo problema deriva dal nascondere la semantica del puntatore. Come ha scritto @iharob: non puntare 'typedef'. Ciò porta solo alla confusione e agli errori sottili.6 Si noti che non è possibile modificare il valore di 'a' nelle funzioni, ma solo di' * a', cioè 'b'. 'a' è abbastanza inutile, potresti aver passato' & b' a 'foo' e stampato' b' direttamente. – Olaf

risposta

13

Il problema qui è la confusione su ciò che viene applicato a const: si applica al valore puntatore stesso o al valore puntato?

const TYPE x sta dicendo che il valore di puntatore deve essere costante. Questo è più o meno equivalente a int * const x. Si noti che il seguente codice fa risultato in un errore:

int b = 10; 
const TYPE p = NULL; 
p = &b; // error here (assign to const) 

quello che ti aspettavi è const int * x, il che rende il valore puntato da x una costante.

Dal momento che il typedef nasconde il fatto che TYPE è un tipo di puntatore, non c'è modo di specificare che la cosa puntato da TYPE dovrebbe essere const, a parte dichiarare un'altra typedef:

typedef const int * CONST_TYPE; 

Tuttavia, a questo puntare il typedef sembra causare più problemi di quanti ne risolva ... Probabilmente non è la migliore idea.

+0

Ho capito il punto che hai fatto e ora cancella la confusione. tuttavia, l'ultima dichiarazione che hai aggiunto era errata per questa domanda poiché stavo cercando un valore costante, non un puntatore costante. Puoi per favore modificarlo in modo che io possa accettare la risposta. –

Problemi correlati