Как объяснили другие, C хранится проще, чем C ++ и не позволяет константным переменным появляться в целочисленных константных выражениях.Но как в C89, так и в C ++ объявленные массивы должны иметь постоянные размеры во время компиляции.
Вы можете использовать перечисления для этого
enum {
BufSize = 5
};
char buf[BufSize + 5];
Это не имеет отношения к внутренней связи - внешние переменные связи одинаково жизнеспособны в выражениях целочисленных констант в C ++.Внутренняя связь в C ++ скорее является следствием, но не необходимостью, позволяющей им появляться в константных выражениях.Стандарт C ++ объясняет, почему они имеют внутреннюю связь по умолчанию
Поскольку объекты const могут использоваться в качестве значений времени компиляции в C ++, эта функция призывает программистов предоставлять явные значения инициализатора для каждого const.Эта функция позволяет пользователю помещать константные объекты в заголовочные файлы, которые включены во многие модули компиляции