Perché la parola chiave statica è stata utilizzata qui?

5

In C standard, hai alcune opzioni per dichiarare una funzione che accetta un puntatore a un blocco di dati:

void style_1(int * arr);

void style_2(int arr[]);

void style_3(int arr[10]);

void style_4(int size, int arr[size]);

void style_5(int arr[static 10]);

void style_6(int size, int arr[static size]);

La cosa è, per quanto posso dire, che la maggior parte della "scelta" è sintattica e non contribuisce molto al reale significato del programma. I primi tre stili sembrano essere esattamente equivalenti, perché "Una dichiarazione di un parametro come 'array di tipo ' deve essere adattata a 'puntatore qualificato a tipo '" (C11 6.7.6.3 p7) e style_4 è uguale per gli scopi del parametro pointer. Sia per style_3 che style_4 , la dimensione dell'array viene eliminata.

style_5 e style_6 sono in realtà diversi e impongono un vincolo utile, garantendo un puntatore non nullo con una quantità minima di memoria. Ma perché abbiamo bisogno di aggiungere una parola chiave per fare questo? Le dichiarazioni di style_3 e style_4 sembrano comunicare altrettante informazioni al lettore. Un compilatore sicuramente non avrebbe problemi con quelli, se solo il linguaggio consentisse loro di essere significativi? Così com'è, questa scelta progettuale sembra introdurre un buco che può permettere di superare errori extra, istruendo efficacemente la macchina non per controllarli per impostazione predefinita.

Perché è stato aggiunto static per imporre il vincolo della dimensione sui parametri dell'array in C? Perché la dimensione non è sufficiente?

    
posta Leushenko 22.09.2016 - 21:10
fonte

2 risposte

3

Per ragioni storiche, in C (e C ++) un parametro il cui tipo è scritto come "array di tipo T" è in realtà un "puntatore al tipo T". Quindi int arr [10] sembra che il parametro sia un array, in realtà è un int* . Le informazioni sulla dimensione sono perse.

In C, se scrivi int arr [static 10] questo si trasforma in int* che punta a 10 elementi. Quale consentirebbe al compilatore di invocare un comportamento indefinito se leggi o scrivi arr[10] o ti avvisa se assegni a arr[10] con una costante 10.

    
risposta data 22.09.2016 - 21:20
fonte
1

Gli stili 5 e 6 sono stati aggiunti abbastanza recentemente al linguaggio C (negli ultimi dieci anni circa), mentre gli altri stili esistono dall'inizio da quasi 30 anni.

Quando si apportano modifiche al linguaggio C, il comitato che lo fa è molto riluttante a dare un nuovo significato ai costrutti sintattici esistenti, perché potrebbe violare un codice esistente che era valido e con un comportamento ben definito.

Questa è la ragione per cui sono stati aggiunti gli stili 5 e 6 per la funzione di passare un array con una dimensione minima garantita, piuttosto che riutilizzare gli stili 3 e 4.

    
risposta data 23.09.2016 - 15:02
fonte

Leggi altre domande sui tag