Целье Статически выделяемого массива за пределами режима C99?
Вопрос
Это относится к решению, опубликованному на: Зацикливание массива фиксированного размера без определения его размера в 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
};
for (char *it = foo[0]; it != NULL; it++) {
printf ("str %s\n", it);
}
return 0;
}
Попытка скомпилировать это дает:
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
Решение
Помимо инициализации в петле, вы увеличиваете не в том месте. Я думаю, что это то, что вы имеете в виду (обратите внимание, что я не совсем являюсь C Guru):
#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;
}
Другие советы
Ваша переменная цикла
it
имеет типchar*
, содержимое массива имеет типconst char*
. Анкет Если вы изменитесьit
быть такжеconst char*
Предупреждение должно исчезнуть.Вы заявляете
it
Внутри утверждения это не допускается в C до C99. Объявитьit
в началеmain()
вместо.
В качестве альтернативы вы можете добавить-std=c99
или же-std=gnu99
на ваши флаги GCC, чтобы включить языковые функции C99.
Использовать -std=c99
опция при составлении кода, чтобы использовать C99
Особенности.
Изменять it
к const char*
Тип (чтобы удалить предупреждения)
Перед C99 объявление этого указателя персонажа в цикле FO не является стандартным.
Вам нужны две вещи, чтобы иметь эту компиляцию без предупреждений: объявить итератор const char* it
, и сделайте это в начале функции, а не в операторе цикла.