Domanda Obiettivo C - Perché le costanti iniziano con k


Perché le costanti in tutti gli esempi che ho visto iniziano sempre con k? E dovrei # definire le costanti nell'intestazione o nel file .m?

Sono nuovo di Objective C, e non so C. C'è qualche tutorial da qualche parte che spiega questo genere di cose senza presupporre la conoscenza di C?


40
2017-08-05 02:14


origine


risposte:


Le costanti iniziali con una "k" sono un retaggio dei giorni pre-Mac OS X. In effetti, penso che la pratica potrebbe anche venire da modo indietro nel tempo, quando il Mac OS era scritto principalmente in Pascal, e il linguaggio di sviluppo predominante era Pascal. In C, #defineLe costanti d sono tipicamente scritte in TUTTI I MAIUSCOLI, piuttosto che il prefisso con una "k".

Per quanto riguarda dove #define costanti: #define loro dove li userete. Se ti aspetti persone che #import il tuo codice per usare le costanti, metterle nel file di intestazione; se le costanti verranno utilizzate solo internamente, inserirle nel .m file.


38
2017-08-05 02:17



Raccomandazioni attuali di Apple per costanti di denominazione non includere il prefisso 'k', ma molte organizzazioni hanno adottato tale convenzione e la usano ancora, quindi la vedete ancora parecchio.


9
2018-05-15 02:32



La domanda su cosa significa "k" è una risposta in questa domanda.

E se hai intenzione di file diversi da quello particolare .m per usare queste costanti, devi inserire le costanti nell'intestazione, dato che non possono importare il .m file.

Potresti essere interessato a Cocoa Dev Central's C tutorial per programmatori Cocoa. Spiega molti concetti chiave.


8
2017-08-05 02:19



k per "konvention". Sul serio; è solo una convenzione.

Puoi mettere un #define dove preferisci; in un'intestazione, nella .m in alto, nella .m proprio accanto a dove la usi. Basta metterlo prima di qualsiasi codice che lo utilizza.

La documentazione "intro to objective-c" fornita con la suite di strumenti Xcode è in realtà abbastanza buona. Leggilo alcune volte (mi piace rileggerlo una volta ogni 2 o 5 anni).

Tuttavia, né esso né alcuno dei libri C di cui sono a conoscenza risponderanno a queste particolari domande. Le risposte diventano ovvie attraverso l'esperienza.


3
2017-08-05 02:20



Il k il prefisso deriva da un momento in cui molti sviluppatori amavano usare Notazione ungherese nel loro codice. Nella notazione ungherese, ogni variabile ha un prefisso che ti dice di che tipo si tratta. pSize sarebbe un puntatore chiamato "dimensione" mentre iSize sarebbe un numero intero di "dimensioni". Solo guardando il nome, conosci il tipo di una variabile. Questo può essere piuttosto utile in assenza di IDE moderni che possano mostrarti il ​​tipo di qualsiasi variabile in qualsiasi momento, altrimenti dovresti sempre cercare nella dichiarazione per conoscerlo. Seguendo la tendenza del tempo, Apple voleva avere un prefisso comune per tutte le costanti.

Ok, perché no c quindi, come c per "costante"? Perché c era già stato preso, in notazione ungherese, c è per "contatore" (cApple significa "conteggio delle mele"). C'è un problema simile con il class, essendo una parola chiave in molte lingue, quindi come si fa a denominare una variabile che punta a una classe? Troverai tonnellate di codice che nominano questa variabile klass e quindi k fu scelto, k come in "konstant". In molte lingue questa parola in realtà inizia con un k, Vedere qui.

Per quanto riguarda la tua seconda domanda: non dovresti usare #define per costante a tutti, se puoi evitarlo, come #define è senza nome

const int x = 10;           // Type is int
const short y = 20;         // Type is short
const uint64_t z = 30;      // Type is for sure UInt64
const double d = 5000;      // Type is for sure double
const char * str = "Hello"; // Type is for sure char *

#define FOO 90

Che tipo è FOO? È una specie di numero. Ma che tipo di numero? Finora qualsiasi tipo o nessun tipo. Il tipo dipenderà da come e dove si usa FOO nel tuo codice.

Inoltre, se hai un numero fisso di numeri, usa un enum come allora il compilatore può verificare che stai usando un valore valido ei valori enum sono sempre costanti.

Se devi usare un define, non importa dove lo definisci. I file di intestazione sono file che condividi tra più file di codice, quindi se hai bisogno della stessa definizione in più di una posizione, devi scriverla in un file di intestazione e includere tale file di intestazione ovunque sia necessaria tale definizione. Quello che scrivi in ​​un file di codice è visibile solo all'interno di quel file di codice, ad eccezione delle funzioni non statiche e delle classi Obj-C che sono visibili globalmente per impostazione predefinita. Ma a meno che una funzione non sia dichiarata in un file di intestazione e tale file di intestazione sia incluso in un file di codice in cui si desidera utilizzare quella funzione, il compilatore non conoscerà l'aspetto di questa funzione (quali parametri si aspetta, quale valore di risultato restituisce) , quindi non può controllare nulla di tutto ciò e deve fare affidamento sul fatto che lo chiami correttamente (di solito questo causerà la creazione di un avviso). Le classi Obj-C non possono essere usate affatto, a meno che tu non dica al file di codice corrente almeno che questo nome è il nome di una classe, ma se vuoi davvero fare qualcosa con quella classe (oltre a passarla semplicemente), il il compilatore deve conoscere l'interfaccia della classe, ecco perché le interfacce vengono inserite nei file di intestazione (se la classe viene utilizzata solo all'interno del file di codice corrente, l'interfaccia di scrittura e l'implementazione nel file sono legali e funzioneranno anche).


2
2017-11-22 15:47



Credo che sia dovuto alla precedente prevalenza della notazione ungherese, quindi k è stato scelto perché c era sinonimo di carattere. ( http://en.wikipedia.org/wiki/Hungarian_notation )

--Alan


1
2018-05-15 01:53