Вот уж нет, приведение указателей на разные типы и конверсия из int это как раз даже не UB, я преувеличил — implementation defined, так написано в 6.3.2.3 пункт 5 стандарта.
5 An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation.
56)
И следуя вашей логике, программы до С11, не являются программами на С.
Вот это уже называется вертеть хвостом, пытаясь апеллировать к последнему стандарту =)
Also, in C89, functions returning int may be implicitly declared by the function call operator and function parameters of type int do not have to be declared when using old-style function definitions. (until C99)
Это из http://en.cppreference.com/w/c/language/declarations#Declarators
А про создание указателя из int, я не вижу смысла обсуждать. Конечно это UB, но иногда при работе с железом так и нужно делать. Не запрещено.
Я не знаю, в каком выдуманном мире вы живете, или как трактуете мат.часть С, но этот код прекрасно компилируется и Clang, и MSVC, и самое интересное работает так, как мне и требуется.
Не буду уточнять версии, т.к.больше чем уверен что этот код соберется любым из десятка имеющихся у меня С-компиляторов.
Это глупая дискуссия между теоретиком и практиком.
Собственно, поскольку грубую ошибку вы не заметили, а придираетесь к пуговицам, возвращаю вам «что вы пока не умеете „на глаз“ отличать „безобидные“ диагностические сообщения от серьезных ошибок, я бы посоветовал вам» =)
Поведение там определено языком С, хотя и непереносимо (только для второго ворнинга).
Кстати именно буквоедство свойственно многим новичкам — это к посту ниже по некоторых индивидуумов.
Я прекрасно понимаю как оно скомпилируется и как работает.
Например вижу ошибку выхода за границу массива в коде выше, о которой НЕТ варнинга.
И меня такое деление устраивает — error как принципиально не компилируемый код, warning- обратите внимание.
Ваши привычки не надо пытаться навязывать, даже если они могут быть полезными. Они могут оказаться ограниченными.
Например, вчера у меня после смены версии gcc, в newlib (это такая версия libc, кто не в курсе), появились варнинги (типа char применяется как индекс массива, ай-яй).
И что вы предложите мне выкинуть — платформу, gcc, newlib или %^&%##-pedantic-errors?
gcc -std=c99 testc.c
testc.c:1:1: warning: return type defaults to 'int'
main()
^
testc.c: In function 'main':
testc.c:3:11: warning: initialization makes pointer from integer without a cast
int *p = 123;
^
Т.е. оба примера допустимы в С, но недопустимы в С++
Собственно, warning's не имеют никакого отношения к корректности языковых конструкций (соответствия синтаксису).
Это всего лишь дружеская необязательная помощь компилятора.
Я не утверждаю, что надо все писать на С, я лишь сказал, что трюки знать надо (да, пятиклассникам).
>толпа юннатов напишет за три дня такой интерфейс для юзеров, что вам и не снилось, ни по срокам ни по качеству.
После проверки кода юннатов да, бывает, снится потом всякое. Но за переделку их работы неплохо платят, когда прижмет.
>на других простых языках, типа Оберона…
На Обероне и прочих языках (c#, d, rust,...) вполне себе можно писать системы — см.выше про Паскаль. Но пока что мы все пользуемся теми, что написаны на С.
>О боже мой, в мире столько архитектур, и только язык Си может покрыть их все
Да, Си есть практически везде. Потому что на нем строится все остальное.
>Жаль, что эволюции в ИТ нет, и она не отправила вас в Верхнюю Тундру
Я там был, там нефть и газ добывают. И софт там совсем не на Яве ))))
>Си гораздо более гибкий чем Паскаль, и даже турбо, и даже Дельфи.
В целом, это неверное утверждение.
>Но м.б. стоит заплатить отказом от трюков
Уже заплатили. Уже поколение, которое не знает трюков, на полном серьезе утверждает, что Ява или даже питон, быстрее чем С.
Мозгами заплатили.
И деньгами постоянно платим за непомерно жрущие ресурсы программы телефонов, телевизоров, итд
Про https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/renderer/CCTexture2D.cpp#L131 очень примитивный подкол.
Это стандартное обращение, начиная с 1го класса изучения С: *pc++=c;
Потому оставьте весь поучающий пафос себе.
И следуя вашей логике, программы до С11, не являются программами на С.
Вот это уже называется вертеть хвостом, пытаясь апеллировать к последнему стандарту =)
Собственно, статья права — никто не знает С.
Это из http://en.cppreference.com/w/c/language/declarations#Declarators
А про создание указателя из int, я не вижу смысла обсуждать. Конечно это UB, но иногда при работе с железом так и нужно делать. Не запрещено.
Не буду уточнять версии, т.к.больше чем уверен что этот код соберется любым из десятка имеющихся у меня С-компиляторов.
Это глупая дискуссия между теоретиком и практиком.
Поведение там определено языком С, хотя и непереносимо (только для второго ворнинга).
Кстати именно буквоедство свойственно многим новичкам — это к посту ниже по некоторых индивидуумов.
Например вижу ошибку выхода за границу массива в коде выше, о которой НЕТ варнинга.
И меня такое деление устраивает — error как принципиально не компилируемый код, warning- обратите внимание.
Ваши привычки не надо пытаться навязывать, даже если они могут быть полезными. Они могут оказаться ограниченными.
Например, вчера у меня после смены версии gcc, в newlib (это такая версия libc, кто не в курсе), появились варнинги (типа char применяется как индекс массива, ай-яй).
И что вы предложите мне выкинуть — платформу, gcc, newlib или %^&%##-pedantic-errors?
Т.е. оба примера допустимы в С, но недопустимы в С++
Это всего лишь дружеская необязательная помощь компилятора.
Вот С++ изначально ответственнее относится к контролю типов.
>толпа юннатов напишет за три дня такой интерфейс для юзеров, что вам и не снилось, ни по срокам ни по качеству.
После проверки кода юннатов да, бывает, снится потом всякое. Но за переделку их работы неплохо платят, когда прижмет.
>на других простых языках, типа Оберона…
На Обероне и прочих языках (c#, d, rust,...) вполне себе можно писать системы — см.выше про Паскаль. Но пока что мы все пользуемся теми, что написаны на С.
>О боже мой, в мире столько архитектур, и только язык Си может покрыть их все
Да, Си есть практически везде. Потому что на нем строится все остальное.
>Жаль, что эволюции в ИТ нет, и она не отправила вас в Верхнюю Тундру
Я там был, там нефть и газ добывают. И софт там совсем не на Яве ))))
В целом, это неверное утверждение.
>Но м.б. стоит заплатить отказом от трюков
Уже заплатили. Уже поколение, которое не знает трюков, на полном серьезе утверждает, что Ява или даже питон, быстрее чем С.
Мозгами заплатили.
И деньгами постоянно платим за непомерно жрущие ресурсы программы телефонов, телевизоров, итд
Это стандартное обращение, начиная с 1го класса изучения С: *pc++=c;
Есть другие прорехи, конечно.
Это такая вариация ада для принтеров =)
Так сколько то в день попыток бесплатных, хватит чтобы оценить уровень пола.
Все там верно