2011-01-06 10 views
28

Come sappiamo, la parola chiave è staticmultiple meanings in C. C99 aggiunto la possibilità di scrivere legalmentePerché la parola chiave "statica" ha tanti significati in C e C++?

void foo (int arr[static 50]) 
{ 
    // ... 
} 

che aggiunge alla confusione, e C++ ha variabili membro statiche e le funzioni.

Questo non sarebbe così problematico se tutti gli usi potrebbero essere collegati in qualche modo, ma trovo difficile trovare quel collegamento per alcuni dei casi. In particolare, perché la parola chiave static dovrebbe essere utilizzata per modificare la visibilità (linkage), o cosa sulla terra ha a che fare con la quantità minima di elementi dell'array.

Quindi c'è una ragione storica per l'abuso della parola chiave static o c'è un collegamento segreto sotto il cofano che connette tutti i suoi usi?

+1

Che cosa significa questa sintassi nel codice di esempio? – Kos

+3

Significa che il parametro "arr" è garantito per avere almeno 50 elementi. – Oystein

+1

Vedere [here] (http://stackoverflow.com/questions/3430315/purpose-of-static-keyword-in-array-parameter-of-function) – Oystein

risposta

26

L'aggiunta di nuove parole chiave a una lingua interrompe la compatibilità con le versioni precedenti. Pertanto, static viene utilizzato quando il suo utilizzo potrebbe significare qualcosa (int arr[static 50] rispetto a int arr[auto 50] o int arr[extern 50]) e non può comparire sintatticamente in quella posizione in base al suo utilizzo nelle versioni precedenti.

Anche se in questo caso l'aggiunta di una parola chiave sensibile not_less_than contesto in quella posizione non sarebbe rompere il codice precedente, sarebbe aggiungere un'altra parola chiave (così semplice editor di testo, che sono parole chiave a conoscenza ma non la sintassi a conoscenza avrebbero non sanno se o non si tratta di un parola chiave), e interrompe la semplificazione "parole chiave non sensibili al contesto"

+0

@Pete: Non riesco proprio ad ottenere questo punto ... Cosa intendi con "interrompe la compatibilità con le versioni precedenti"? Compatibilità con editor di testo non più supportati che non possono aggiungere una nuova parola chiave alla loro lista o intendi qualcos'altro? –

+13

L'aggiunta di 'not_less_than' come parola riservata _would_ rompe il codice precedente se il codice precedente aveva una variabile chiamata' not_less_than'. Questo è ciò che si intende per rompere la compatibilità all'indietro. –

+3

Sì, penso che il motivo principale per "riusare" le parole chiave è che siamo certi che nessuno di noi lo abbia usato come identificatore o addirittura come un "# define" nel loro codice. – aschepler

-5

Un cammello è un cavallo progettato da un comitato.

http://en.wikipedia.org/wiki/Design_by_committee

aggiunto: membri del Comitato coinvolti nella progettazione sono conservatori, e sono più interessati a non rompere codice esistente C++ rispetto al potenziale eleganza del nuovo codice.

+11

Potrebbe essere un bel commento sulla domanda, ma rende molto risposta povera. –

+7

Ma C è un cavallo, e uno buono per quello. –

+0

Questo è il tipo di risposte che ottieni quando fai una domanda come "c'è una ragione storica per ...?" Ma questo non lo rende buono. –

1

static Il significato originale in C++ è in realtà deprecato, sostituito da namespace senza nome. L'unico modo in cui static viene effettivamente utilizzato nel codice C++ corrente è di non essere membro.

+4

Stai dimenticando la statica a livello di funzione? (Che non sono deprecati.) Non so se questo è il "significato originale" della staticità in C, ma credo che questo uso esistesse prima del C++. –

+0

@Fred: il significato originale di 'static' era variabile per ambito. Ho dimenticato la statica a livello di funzione, ma le statiche a livello di funzione e di classe mi sembrano più che abbastanza simili nel concetto per non qualificarmi come un significato multiplo. – Puppy

+0

@DeadMG: lo statico di C99 sembra avere un significato completamente diverso, sebbene –

1

Penso che le ragioni siano diverse per i diversi utilizzi di questa parola chiave. Se consideriamo che la funzione scope e lo scope del file siano usati come da classici C (sono almeno concetti simili) la prima aggiunta fuori tema è lo static in C++ per nominare un membro globale di una classe.

Immagino che la scorciatoia fosse solo che "statico" e "globale" sembravano essere abbastanza vicini e il primo C++ era molto attento a non introdurre nuove parole chiave che avrebbero infranto il codice esistente. Quindi hanno preso uno esistente che non poteva apparire in quel contesto.

Per l'add-on C99 per i parametri dell'array le cose sono diverse, penso, perché static non è l'unica aggiunta, qui. Si può anche avere tipo qualificazioni (const e volatile) che qualificano il puntatore implicita:

void toto1(char str[const 5]); 
void toto2(char*const str); 

definiscono prototipi compatibili. Posso solo supporre che la scelta dello specifier della classe di memoria static per lo scopo che hai menzionato (lunghezza minima dell'array) sia stata vista come un'estensione naturale di quella sintassi.Probabilmente anche è stato facilmente dimostrato che questo uso era compatibile con il resto del linguaggio, argomentando dove un qualificatore di tipo può essere usato per estendere la lingua, un identificatore di classe di memoria non può fare molto danno.

2

C'è un modo molto semplice di ricordare tutti i 3 significati di C++ di static di cui sono a conoscenza. static significa "praticamente come variabile globale/funzione ma disponibile solo direttamente nell'ambito di ..."

  • "... questo file" se è nell'ambito globale.
  • "... questa funzione" se si trova in una funzione (incluse le funzioni membro). Nota che se rendi classi e lambda in una funzione, sono ancora in questo ambito. Lambda con una cattura vuota può accedere alla variabile statica della sua funzione "genitore".
  • "... questa classe" se è in una classe (compresi quelli dichiarati con struct). Questo caso è leggermente diverso in quanto è possibile accedere alla variabile/funzione attraverso un oggetto o tramite il prefisso, ma questo è un po 'come chiedere alla classe o al suo oggetto di fornirvi l'accesso, e infatti può essere negato (con private) . Quindi l'accesso non è "diretto".

Nel caso della sintassi di array C99 presentata, questo è qualcosa di completamente diverso e presumo che fosse lì per non introdurre nuove parole chiave, come altri suggeriscono.