Annodare un array allocato staticamente, fuori della modalità c99?
Domanda
Questo è in riferimento ad una soluzione pubblicati su: annodare una matrice di dimensione fissa senza definire la sua dimensione in C
Ecco il mio codice di esempio:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
static const char *foo[] = {
"this is a test",
"hello world",
"goodbye world",
"123",
NULL
};
for (char *it = foo[0]; it != NULL; it++) {
printf ("str %s\n", it);
}
return 0;
}
Il tentativo di compilare questo dà:
gcc -o vararray vararray.c
vararray.c: In function ‘main’:
vararray.c:14: warning: initialization discards qualifiers from pointer target type
vararray.c:14: error: ‘for’ loop initial declaration used outside C99 mode
Soluzione
Oltre l'inizializzazione nel ciclo for, si sta incrementando nel posto sbagliato. Penso che questo sia quello che vuoi dire (notare che io non sono esattamente un guru C):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
static const char *foo[] = {
"this is a test",
"hello world",
"goodbye world",
"123",
NULL
};
const char **it;
for (it=foo; *it != NULL; it++) {
printf ("str %s\n", *it);
}
return 0;
}
Altri suggerimenti
-
Il ciclo
it
variabile è di tipochar*
, i contenuti della matrice sono di tipoconst char*
. Se si cambiait
di essere anche unconst char*
l'avviso dovrebbe andare via. -
Si dichiara
it
all'interno for, questo non è consentito in C prima di C99. Dichiarareit
all'inizio delmain()
invece.
In alternativa è possibile aggiungere o-std=c99
-std=gnu99
alle flag gcc per abilitare le caratteristiche del linguaggio C99.
Utilizzare l'opzione -std=c99
durante la compilazione il codice al fine di utilizzare le funzioni C99
.
Cambia it
di tipo const char*
(per rimuovere le avvertenze)
Prima di C99, dichiarando che puntatore a carattere nel ciclo for non è standard.
Hai bisogno di due cose per avere questo compilare senza avvisi: dichiarare il const char* it
iteratore, e lo fa, all'inizio della funzione e non nella dichiarazione ciclo