Следующая (предположительно надуманная) программа на C не может быть скомпилирована:
int main() {
const int array[] = {1,2,3};
static int x = array[1];
}
При компиляции вышеуказанного исходного файла C с помощью gcc (или CL.EXE от Microsoft) я получаю следующую ошибку:
error: initializer element is not constant
static int x = array[1];
^
Такой простой и интуитивно понятный синтаксис, безусловно, полезен, поэтому кажется, что он должен быть законным, но, очевидно, это не так. Конечно, я не единственный человек, разочарованный этим явно глупым ограничением. Я не понимаю, почему это запрещено - какую проблему пытается избежать язык C, сделав этот полезный синтаксис незаконным?
Кажется, что это может иметь какое-то отношение к тому, как компилятор генерирует код сборки для инициализации, потому что если вы удалите ключевое слово "static" (такое, что переменная "x" находится в стеке), то это компилируется нормально.
Однако еще одна странная вещь заключается в том, что он прекрасно компилируется в C ++ (даже с ключевым словом static), но не в C. Таким образом, компилятор C ++, похоже, способен генерировать необходимый код сборки для выполнения такой инициализации.
Edit:
Благодарю Дэвислора - в попытке умиротворить власть имущих СО, я бы искал следующие типы фактической информации, чтобы ответить на вопрос:
Существует ли какой-либо устаревший код, который поддерживал бы эту семантику, сломался бы?
Были ли эти семантики официально предложены комитету по стандартам?
Кто-нибудь когда-либо приводил причину отклонения допущения этой семантики?