Причина некоторых из этих различий заключается в том, что мы можем избавиться от макросов препроцессора, что было одной из ранних целей Бьярне.
В C мы могли бы иметь
#define MAX_FOOS 10
int foos[MAX_FOOS];
В C ++ мы бы предпочли иметь возможность писать
const int max_foos = 10;
int foos[max_foos];
Для того, чтобы это работало, max_foos
должно использоваться в постоянном выражении. Он также должен иметь внутреннюю связь, поэтому определение может появляться в заголовке, не вызывая многократных ошибок определения, и, что более важно, чтобы компилятору было проще не выделять хранилище для max_foos
.
Когда комитет C принял const от C ++, они не применили антипатию к макросам, поэтому им не понадобилась эта семантика.