2009-12-28 4 views
1

Это ссылка на решение размещена на: Looping a fixed size array without defining its size in CЗацикливание статически выделенного массива, вне режима c99?

Вот мой пример кода:

#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 
+0

Уточнить: Режим C99 «запрещено», и вам нужно обходным - ИЛИ - вы открыты для используя режим C99? – Roboprog

ответ

7

Помимо инициализации в цикле for, вы увеличиваетесь не в том месте. Я думаю, что это то, что вы имеете в виду (обратите внимание, что я не совсем 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; 

} 
+1

Да, это ++ имеет смысл только для **. – diciu

0

Перед C99, заявив, что указатель на символ в цикл for не является стандартным.

1

Используйте опцию -std=c99 при компиляции кода, чтобы использовать функции C99.

Изменение it для const char* типа (для удаления предупреждений)

+0

-1 Можно использовать немного «мяса» ... –

0

Вам нужны две вещи, чтобы это компилируется без предупреждений: объявить итератор const char* it, и сделать это в начале функции, а не в петле заявление.

6
  1. переменная it цикл имеет тип char*, содержимое массива имеют тип const char*. Если вы измените it, чтобы быть также const char*, предупреждение должно исчезнуть.

  2. В заявлении for вы объявляете it, это недопустимо в C до C99. Вместо этого объявите it в начале main().
    В качестве альтернативы вы можете добавить -std=c99 или -std=gnu99 к вашим флагам gcc, чтобы включить возможности языка C99.