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?