В чем проблема со следующим фрагментом кода? - PullRequest
4 голосов
/ 25 марта 2011

Этот фрагмент кода, кажется, создает некоторые проблемы при компиляции. Любое объяснение?

int i =20;
int maxlen = i;
int main()
{
     int j = i;
     printf("i=%d , j=%d\n", i , j);
}

Ответы [ 3 ]

5 голосов
/ 25 марта 2011

Вы можете использовать только константы времени компиляции при инициализации переменной в этой области.Попробуйте:

int i = 20;
int maxlen;

int main()
{
   maxlen = i; // assign within the scope of a function
   int j = i;
   printf("i=%d , j=%d\n", i , j);
}
5 голосов
/ 25 марта 2011

В C вы не можете инициализировать глобальные переменные, используя неконстантные выражения. Инициализация maxlen для i завершается неудачно, потому что i не является константным выражением. Это часть стандарта C.

Почему не #define константа?

#define MAXLEN 20
0 голосов
/ 25 марта 2011

Этот код недействителен в C , но действителен в C ++ :

C - http://www.ideone.com/mxgMo

Причина ошибки -: элемент инициализатора не является константой

C ++ - http://www.ideone.com/XzoeU

Работает .

Потому что:

C ++ Стандартные состояния:

3.6.1 Основная функция [basic.start.main]

1 Программа должна содержать глобальную функцию main, которая является назначенным началом программы. Это реализация, определяемая, требуется ли программе в автономной среде для определения главной функции. [Примечание: в автономной среде запуск и завершение определяются реализацией; запуск содержит выполнение конструкторов для объектов области имен пространства со статической продолжительностью хранения; Завершение содержит выполнение деструкторов для объектов со статической длительностью хранения . —Конечная записка]

Однако C99 говорит это:

56.7.8 Инициализация

4 Все выражения в инициализаторе для объекта со статической продолжительностью хранения должны быть константными выражениями или строковыми литералами.

Так что не только код, который вы разместили, но что-то подобное также будет недействительным в C :

#include<stdio.h>

int needint(void);

int i =needint();

int needint(void)
{
    return 1;
}

int main()
{
   int j = i;
   printf("i=%d , j=%d\n", i , j);
}

Смотрите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...