Perché i VLA a lunghezza zero sono consentiti in C99, ma non in C11?

1

Nei commenti a questa precedente domanda , lì era una discussione se lo standard C consentiva array di lunghezza variabile (VLA) di lunghezza 0 o meno. A quanto pare, lo standard C99 afferma:

In 6.7.5.2 Dichiaratori di array, vincoli:

"If the expression [for the array size] is a constant expression, it shall have a value greater than zero."

Quindi, poiché lo standard menziona esplicitamente le "espressioni costanti", è chiaro che questo vincolo non deve valere per espressioni non costanti, significa che sono consentiti VLA a lunghezza zero. Questo è davvero un comportamento utile, quindi per esempio GCC l'ha introdotto molto prima del C99 come estensione e attualmente supporta questo AFAIK.

D'altra parte, lo standard C11 (bozza) in 6.7.6.2 (dichiaratori di array, vincolo 5) dice:

If the size is an expression that is not an integer constant expression: if it occurs in a declaration at function prototype scope, it is treated as if it were replaced by *; otherwise, each time it is evaluated it shall have a value greater than zero.

Quindi questo proibisce esplicitamente i VLA con array a lunghezza zero. Ad esempio, in base a questa modifica, una funzione come

void MySpecialProcessing(int n, int *data)
{
    int sortBuffer[n];
    // ... do something with data, using sortBuffer ...
}

forse C99 compatibile senza alcun trattamento speciale per n==0 , ma in C11, deve essere

void MySpecialProcessing(int n, int *data)
{
    if(n==0)
        return;

    int sortBuffer[n];
    // ... 
}

Normalmente mi aspetterei che le versioni più recenti dello standard introducano funzionalità che rendano la vita più facile per il programmatore, ma in questo caso IMHO sembra un passo indietro.

Quindi qualche idea del perché questo cambiamento incompatibile e irrisolto è stato introdotto? Questo è intenzionale, o solo un bug nello standard C11?

    
posta Doc Brown 12.07.2014 - 09:15
fonte

1 risposta

1

Non ci sono stati cambiamenti in questo senso tra C99 e C11.

Lo standard C99 afferma nella sezione 6.7.5.2/5 (sotto Semantics):

If the size is an expression that is not an integer constant expression: [...]; otherwise, each time it is evaluated it shall have a value greater than zero. [...]

Poiché non si tratta di un vincolo, la violazione dei risultati "deve" comporta un comportamento non definito.

    
risposta data 12.07.2014 - 09:53
fonte

Leggi altre domande sui tag