Кто-нибудь знает, в чем суть этой идеи?
- В основном это позволяет компилировать доисторический код без ошибок?
- Или просто для соответствия стандарту?Тогда последний, возможно, нуждается в некотором исправлении.
Это соответствует стандарту в том смысле, что стандарт требует соответствующих реализаций для диагностики таких проблем, как @R .. описывает в своем ответе.Однако реализации не необходимы для отклонения программ из-за таких проблем.Что касается того, почему некоторые компиляторы вместо этого принимают такие программы, это нужно будет оценивать для каждой конкретной реализации, но эта цитата из первого издания K & R может пролить немного света:
5.6 Указатели не являются целыми числами
В более старых программах на Си вы можете заметить довольно резкое отношение к копированию указателей.Обычно верно, что на большинстве машин указатель может быть назначен целому числу и обратно;не происходит масштабирование или преобразование, и биты не теряются.К сожалению, это привело к лишению свободы с подпрограммами, которые возвращают указатели, которые затем просто передаются другим подпрограммам - требуемые объявления указателей часто пропускаются.
(Kernighan & Ritchie, * 1023)* Язык программирования C , 1 st ed., 1978)
Во-первых, обратите внимание, что это долго предшествует даже C89.Сегодня я немного удивлен, что авторы , а затем говорили о "старых" программах на Си.Но учтите также, что даже в то время язык C, определенный K & R, формально не разрешал неявное преобразование между указателями и целыми числами (хотя он допускал приведение между ними).
Тем не менее, были программы, которые полагались нанеявное преобразование в любом случае, по-видимому, потому что оно работало на целевых реализациях.Это было привлекательно, по стандартам некоторых людей в то время, в сочетании с правилами неявной типизации изначального Си.Можно позволить переменной или функции, предназначенной для возврата или сохранения указателя по умолчанию набирать int
, вообще пропустив ее объявление, и до тех пор, пока оно интерпретируется как указатель везде, где оно в конечном итоге используется, все, как правило, работает как задумано.
Я склонен догадываться, что все, что продолжает работать, как предполагалось, тем самым поддерживая обратную совместимость, было разработчиком компилятора, который продолжал принимать неявные преобразования, так что это «позволяет компилировать [до] доисторический код»«.Однако я отмечаю, что в наши дни код с неявными преобразованиями такого рода гораздо реже работает, чем предполагалось, поскольку на многих машинах в наши дни есть 64-разрядные указатели, но только 32-разрядные int
с.