ошибка в с, но не в с ++ - PullRequest
       26

ошибка в с, но не в с ++

8 голосов
/ 17 июня 2010
const int t=5;
char buf[t+5];

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

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

Ответы [ 6 ]

9 голосов
/ 17 июня 2010

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

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

4 голосов
/ 17 июня 2010

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

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

enum {
  BufSize = 5
};

char buf[BufSize + 5];

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

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

4 голосов
/ 17 июня 2010

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

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

Источник

3 голосов
/ 17 июня 2010

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

1 голос
/ 17 июня 2010

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

enum dummy { t=5 };

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

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

1 голос
/ 17 июня 2010

Да, это связано с внешним связыванием C т.

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

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