Почему эта программа на C не компилируется?Что не так с этим? - PullRequest
5 голосов
/ 02 июля 2010

Почему эта программа на C не компилируется?Что не так с этим?

Я пробовал на wxDevC++ и Turbo C ++ 3.0.

Main.c

#include<stdio.h>
#include<conio.h>

const int SIZE = 5;

int main(int argc, char ** argv)
{    
    char array[SIZE] = {'A', 'B', 'C', 'D', 'E'};

    printf("Array elements are,\n");
    int i=0;

    for(i=0 ; i<SIZE ; ++i)
    {
        printf("%c  ", array[i]);
    }

    getch();

    return 0;
}

Сообщения об ошибках на обоихКомпиляторы похожи.

f:\_Source-Codes\main.c In function `main':

8 f:\_Source-Codes\main.c variable-sized object may not be initialized

Ответы [ 4 ]

15 голосов
/ 02 июля 2010

Размер массива на языке C89 / 90 должен быть задан целочисленным константным выражением (в общем случае также верно для C99). Объект const int в C не является константным выражением , поэтому его нельзя использовать для указания размера массива. Примечание: это одно существенное различие между C и C ++.

В языке C термин константа относится к буквальным константам, т. Е. 5, 10.2, 0xFF, 'a' и т. Д. константы , если быть точным). Объект const int, опять же, не является константой в C и не может использоваться для построения константных выражений.

Если вы хотите предварительно объявить именованную константу для использования в качестве размера массива в C, вы должны использовать либо #define, либо enum. То же самое относится к меткам регистра, размерам битовых полей и любому другому контексту, требующему постоянного выражения.

Подробнее см. .

8 голосов
/ 02 июля 2010

, если компилятор обрабатывает его как файл '.c', объявление int i должно предшествовать любым исполняемым строкам, особенно перед printf.

РЕДАКТИРОВАТЬ, теперь, когда вы показали сообщение об ошибке:

Компилятор не считает SIZE константой при компиляции main. Вы можете использовать #define SIZE 5 в качестве обходного пути.

Согласно K & R 2nd Ed. :

"Цель const - объявить объекты, которые могут быть размещены только для чтения. объем памяти. ... кроме того, что он должен диагностировать явные попытки изменить const объекты, компилятор может игнорировать const] квалификатор ".

Таким образом, объявление const int SIZE = 5 не делает SIZE константным выражением , чего требует спецификатор размера массива.

5 голосов
/ 02 июля 2010

Попробуйте заменить

const int SIZE = 5;

на

#define SIZE 5

Большинство компиляторов C не позволяют объявлять статические массивы, размеры которых содержатся в переменных (т. Е. Размер массива определяется во время выполнения).

3 голосов
/ 02 июля 2010

попробуйте это:

char array[] = {'A', 'B', 'C', 'D', 'E'};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...