enum sample {sage, thyme, salt, pepper}; enum sample season;
season = sage; /* допустимо в С, C++ */
season = 2; /* предупреждение в С, ошибка в C++ */
season = (enum sample) 3; /* допустимо в С, C++ */
season++; /* допустимо в С, ошибка в C++ */
Справочные материалы 915
Кроме того, C++ позволяет не указывать ключевое слово enum при объявлении переменной:
enum sample {sage, thyme, salt, pepper};
sample season; /* недопустимо в С, допустимо в C++ */
Как в случае со структурами и объединениями, это может привести к конфликтам, если имена переменной и типа enum совпадают.
Указатель на void
В языке C++, как и в С, указателю на void можно присвоить указатель любого типа, но в отличие от С, указатель на void нельзя присваивать указателю другого типа без явного приведения. Сказанное демонстрируется в следующем коде:
int ar[5] = {4, 5, 6,7, 8}; int * pi; void * pv;
pv = ar; /* допустимо в С, C++ */
pi = pv; /* допустимо в С, недопустимо в C++ */
pi = (int * ) pv; /* допустимо в С, C++ */
Еще одно отличие C++ заключается в том, что вы можете присваивать адрес объ
екта производного класса указателю на базовый класс, но это относится к возможностям, которые в С отсутствуют.
Булевские типы
В языке C++ булевский тип называется bool, a true и false являются ключевыми словами. В языке С булевский тип имеет название Bool, но включение заголовочного файла stdbool.h делает доступными bool, true и false.
Альтернативное написание
В C++ альтернативное написание or для || и прочих операций обеспечивается ключевыми словами. В С99 и С11 альтернативные написания определены в виде макросов, и для того, чтобы сделать их доступными, необходимо включить заголовочный файл iso64 6.li.
Поддержка широких символов
В C++ тип wchar t является встроенным, a wchar t — ключевым словом. В С99 и C11 тип wchar t определен в нескольких заголовочных файлах (stddef.h, stdlib.h, wchar.h, wctype.h). Подобным же образом, charl6_t и char32_t — это ключевые слова в С++11, но макросы, определенные в uchar.li, в СИ.
Язык C++ предоставляет поддержку ввода-вывода широких символов (wchar t, charl6_t и char32_t) через заголовочный файл iostream, тогда как С99 предлагает совершенно другой пакет поддержки ввода-вывода, доступный через заголовочный файл wchar.h.
Комплексные типы
Язык C++ поддерживает комплексные типы посредством класса complex, предоставляемого с помощью заголовочного файла complex. Язык С имеет встроенные комплексные типы и поддерживает их через заголовочный файл complex.h. Эти два подхода существенно отличаются и несовместимы друг с другом. Версия С в большей степени отражает практические потребности вычислительного сообщества.
916 Приложение Б
Встраиваемые функции
В стандарте С99 была добавлена поддержка встраиваемых функций — средства, которое давно существовало в языке C++. Однако их реализация в С99 является более гибкой. В C++ встраиваемая функция по умолчанию имеет внутреннее связывание. Если встраиваемая функция C++ появляется в более чем одном файле, то она должна иметь одно и то же определение, используя те же самые лексемы. Например, один файл не может иметь определение с параметром типа int, а другой — определение с параметром типа int32_t, несмотря на то, что int32_t — это typedef для int. Гем не менее, в С такая организация разрешена. Кроме того, как было описано в главе 15, язык С позволяет смешивать встраиваемые и внешние определения, что в C++ не допускается.