2013-03-19 3 views
11

Utilizzo una coppia di funzioni che utilizzano un puntatore come chiave univoca. Voglio dichiarare un puntatore costante da usare come chiave. Qual è l'approccio più sicuro e più chiaro per farlo?Qual è il metodo più chiaro per la dichiarazione di un puntatore costante?

Qui ci sono 2 possibili approcci, ma entrambi hanno una breve corrispondenza.

  1. Un auto puntatore riferimento:

    static const void * const propertyKey = &propertyKey; 
    //... 
    objc_getAssociatedObject(object, propertyKey); 
    

    Downside: la dichiarazione è lungo e spaventoso bello! Potrebbe facilmente confondere qualcuno che non sa a cosa serve. Upside: difficile una volta capito cosa fa è facile da usare.

  2. Un const statico che dovrebbe essere fatto riferimento:

    static const char propertyKey; 
    //... 
    objc_getAssociatedObject(object, &propertyKey); 
    

    Contro: Quando viene utilizzato il variabile deve essere fatto riferimento piuttosto che semplicemente utilizzato, che è facile perdere (ma compilatore dovrebbe sottolineare questo come un tipo non corrispondente). Se la dichiarazione viene modificata in modo che venga assegnato un valore, potrebbe avere effetti disastrosi perché l'univocità del puntatore non può più essere garantita. Upside: la dichiarazione è più facile da convincere.

Non penso che nessuno di questi sia immediatamente evidente. Qualche suggerimento migliore?

+1

Quale problema stai cercando di risolvere? – Sebivor

+0

Chiedo perché non sembra esserci alcun vantaggio nell'usare i puntatori alle variabili statiche come chiavi per gli array assosciative. Perché non usare solo variabili statiche? – Sebivor

+0

@modifiablelvalue Poiché 'objc_setAssociatedObject()' richiede che le chiavi siano puntatori a 'void'. –

risposta

2

Mi piace anche la vostra prima idea. Vorrei solo andare con quello. La tua seconda idea corre il rischio che il compilatore possa comprimere più variabili static const char in una, poiché è garantito che mantengano sempre il valore 0 e, dal punto di vista di un compilatore, non sono sicuro che siano sufficientemente distinti. E non riesco a pensare ad una soluzione migliore della tua prima idea.

(Trasformato in una risposta da una discussione nei commenti.)

1

3: Un puntatore che è impostato su qualcosa di significativo ma unico:

static const void *const key = "PropertyKey"; 
+0

Anche in questo caso il debugger ha delle buone probabilità. –

+11

È unico come la stringa. Se la stessa stringa è stata usata per errore due volte, potrebbe scontrarsi. – JasonD

+1

Per la cronaca, non ho fatto downvot. Ho appena fatto un'osservazione. – JasonD