LINUX.ORG.RU

История изменений

Исправление PPP328, (текущая версия) :

Именно это советует Бьярне Страуструп

А вы вообще на источник внимания не обратили, да? «C++ Core Guidelines» - это мануал для написания С++ кода, а выдержка про С относится к С-коду который будет линковаться с С++.

Если писать на С в режиме «совместимо с С++», и потом компилить через плюсовый компилятор, то получите ооох, как много побочных эффектов и ограничений, потому что С++ и С это разные языки!

Удачи скомпилировать non-trivial designated initializers в С++. А тех, кто постоянно кастует результат malloc к указателю на таргет вообще надо отлучать от С.

Плюс получите разный размер пустых структур; разные типы enum; невозможность применить int к enum-типам; обход инициализаторов с помощью goto (хотя так лучше и в С не делать); С и С++ имеют разное поведение механизмов long jump, из-за чего поведение стека разительно отличается; различие поведения с одинаковыми именами struct N и N (потомушта труп страуса сказал что ему лень писать struct каждый раз, поэтому не пишите struct); (моё любимое) - func() - означает совершенно разные вещи в С и С++; разная область видимости типа вложенной структуры; наличие в С механизма объявления сложного типа (struct/union/enum) в прототипах функций; C11/99 вообще принес дофига того, до чего в С++ еще не додумались: комплексные числа, VLA, flexible array memebers, restrict, compound literals; квалификатор параметра массива; разный размер ‘a’-заданных символов; разное поведение экспорта символов модуля по-умолчанию; разный тип bool; и прочая, и прочая. Мы на некоторых собеседованиях просим соискателя назвать как можно больше отличий С++ от С. Некоторые доходили до 50.

Вот простейший пример:

Ага, и gcc даже выругался, сказав что кастуется несовместимый тип. Тех, кто игнорирует предупреждения компилятора надо сжигать на кострах. Иногда, кстати, хоть это и не по стандарту, такой каст нужен. И в с++ вы его физически не сделаете быстро, только через какие-то костыли или долгий memcpy.

Исходная версия PPP328, :

Именно это советует Бьярне Страуструп

А вы вообще на источник внимания не обратили, да? «C++ Core Guidelines» - это мануал для написания С++ кода, а выдержка про С относится к С-коду который будет линковаться с С++.

Если писать на С в режиме «совместимо с С++», и потом компилить через плюсовый компилятор, то получите ооох, как много побочных эффектов и ограничений, потому что С++ и С это разные языки!

Удачи скомпилировать non-trivial designated initializers в С++. А тех, кто постоянно кастует результат malloc к указателю на таргет вообще надо отлучать от С.

Плюс получите разный размер пустых структур; разные типы enum; невозможность применить int к enum-типам; обход инициализаторов с помощью goto (хотя так лучше и в С не делать); С и С++ имеют разное поведение механизмов long jump, из-за чего поведение стека разительно отличается; различие поведения с одинаковыми именами struct N и N (потомушта труп страуса сказал что ему лень писать struct каждый раз, поэтому не пишите struct); (моё любимое) - func() - означает совершенно разные вещи в С и С++; разная область видимости типа вложенной структуры; наличие в С механизма объявления сложного типа (struct/union/enum) в прототипах функций; C11/99 вообще принес дофига того, до чего в С++ еще не додумались: комплексные числа, VLA, flexible array memebers, restrict, compound literals; квалификатор параметра массива; разный размер ‘a’-заданных символов; разное поведение экспорта символов модуля по-умолчанию; разный тип bool; и прочая, и прочая. Мы на некоторых собеседованиях просим соискателя назвать как можно больше отличий С++ от С. Некоторые доходили до 50.