ошибка в c, но не в C++

const int t=5;
char buf[t+5];

Когда я компилирую, это дает ошибку в C, но не в C++!!
Кто-либо может объяснить меня причина?

Примечание: Я знаю значения по умолчанию константы к внутренней связи в 'C++', где как в 'C' это принимает значение по умолчанию к внешней связи. Это имеет какое-либо отношение к вышеупомянутому случаю??

8
задан Péter Török 17 June 2010 в 11:50
поделиться

6 ответов

Как объясняли другие, язык C более прост, чем C++, и не позволяет переменным const появляться в целочисленных константных выражениях. Но и в C89, и в C++ объявленные массивы должны иметь постоянные размеры.

Для этого можно использовать перечисления

enum {
  BufSize = 5
};

char buf[BufSize + 5];

Это не связано с внутренней связью - переменные с внешней связью одинаково жизнеспособны в целочисленных константных выражениях в C++. Внутренняя связь в C++ скорее является следствием, но не необходимостью, разрешения их появления в константных выражениях. Стандарт C++ объясняет, почему по умолчанию они имеют внутреннюю связь

Поскольку в C++ объекты const могут использоваться как значения времени компиляции, эта особенность побуждает программистов предоставлять явные значения инициализатора для каждой const. Эта особенность позволяет пользователю помещать объекты const в заголовочные файлы, которые включены во многие компиляторы

4
ответ дан 5 December 2019 в 07:33
поделиться

Я думаю, это потому, что компилятор не может вычислить t + 5 в постоянное выражение. Похоже, что все должно быть в порядке, но:

Один важный момент, связанный с объявлениями массивов, заключается в том, что они не позволяют использовать различные индексы. Приведенные числа должны быть постоянными выражениями, которые могут быть вычислены во время компиляции, а не во время выполнения.

Источник

4
ответ дан 5 December 2019 в 07:33
поделиться

В C размер массива должен быть постоянным выражением. Const Int в C не является постоянным выражением. Его значение больше похоже на "readonly". Вместо этого используйте #define t 5.

3
ответ дан 5 December 2019 в 07:33
поделиться

Это недопустимо в C89 C, хотя может быть действительным в C99

См. этот вопрос о переполнении стека

9
ответ дан 5 December 2019 в 07:33
поделиться

У вас есть две проблемы: массивы с динамическим размером и константы. Концепция const отличается в C и C ++. Для C это просто переменная, которую вы не имеете права изменять, и поэтому она не является допустимым измерением для C-диалектов, которые допускают только массивы с фиксированными размерами времени компиляции. Единственный способ определить "константу времени компиляции" в C - использовать перечислимый тип

enum dummy { t=5 };

. Так что такая вещь будет работать с C89.

В отличие от этого ваш код также должен работать на C99. Там массив будет синтаксически идентифицирован как динамический размер. Тогда любой достойный оптимизатор сможет это оптимизировать. Но помните также, что sizeof (buf) будет общим размером массива (10) в C ++, тогда как с c99 это будет sizeof (char *)

1
ответ дан 5 December 2019 в 07:33
поделиться

Да, это связано с внешней компоновкой C t.

Вы объявили целое число t с внешней связью. Если вы свяжете этот файл с другим файлом, который определяет t, тогда размер вашего буфера должен быть определен после времени компиляции файла, что, конечно, невозможно в C.

1
ответ дан 5 December 2019 в 07:33
поделиться