2016-04-27 23 views
5

Quando si dichiara la struttura indicata di seguito, viene generato un errore di compilazione.Impossibile rendere il campo della struttura come costante in C

typedef struct{ 
    const char x; //it is throwing compilation error 
    const char y; 
}A; 

void main() 
{ 
    A *a1; 
    a1 = (A*)malloc(2); 
} 

Come posso fare il campo di struttura (caratteri x e y) come costante?

+3

È possibile effettuare l'intera istanza costante, al momento della creazione, dal momento che le variabili costanti possono essere inizializzate: – BlackMamba

+0

@BlackMamba che ha funzionato, grazie. –

risposta

11

Questo dovrebbe andare bene, ma ovviamente non è possibile assegnarli, utilizzare solo l'inizializzazione.

Quindi non ha molto senso allocare un'istanza nello heap.

Questo funziona:

#include <stdio.h> 

int main(void) { 
    typedef struct { 
     const int x, y; 
    } A; 
    A my_a = { 12, 13 }; 
    printf("x=%d\ny=%d\n", my_a.x, my_a.y); 
    return 0; 
} 

Esso stampa:

x=12 
y=13 

Inoltre, please don't cast the return value of malloc() in C.

+0

perché questo è ok per la struttura interna? Dì il detial – BlackMamba

+0

@BlackMamba Cosa? La posizione del 'typedef' non ha importanza qui, preferisco semplicemente non ingombrare l'ambito globale. – unwind

+0

Si sposta 'typedef struct { const int x, y; } A; 'all'interno di' int main() {} ' – BlackMamba

-1

Non è possibile. Con POO in C è possibile disattivare la modifica di questi campi, se:

  • definiscono getter: char A_get_x(A *p); e char A_get_y(A *p);
  • definiscono la struct nella .c per nascondere la sua attuazione
  • solo scrivere typedef struct A A; in il file .h, per permettere di usare quel tipo.
  • definisce un costruttore: A *A_new(); che restituisce A con i valori desiderati su xe y.

In questo modo, è possibile modificare solo i valori nel costruttore, e dopo l'oggetto viene creato i valori non cambierà (se non forzare i valori con puntatori ecc ..)

-1

primo luogo, dovrebbe usare malloc per allocare la dimensione della struttura, non un numero magico 2. Inoltre, non trasmettere il valore di ritorno malloc, viene automaticamente promosso al tipo di puntatore compatibile.

a1 = malloc(sizeof(A)); 

In secondo luogo, non in realtà non è molto uso per rendere membro struct const.

A *a1; 
a1 = malloc(sizeof(A)); 

a1 s' membri non vengono inizializzati a qualsiasi stato qui, ma il compilatore proibito qualsiasi assegnazione ad essi, in quanto definita come const, quindi a1->x = 'a'; non verrà compilato.

A a2; 
a2->x = 'a'; // won't compile too 

L'unico caso d'uso valida è:

A a3 = {'a', 'b'};