Справочное руководство по C++ - [54]

Шрифт
Интервал

Функции-члены могут быть статическими; §R.9.4.

Функции-члены могут быть const или volatile; §R.9.3.1.

Можно явно указать связывание с подпрограммами на других языках; §R.7.4.

Можно перегружать операции -›, -›* и `; §R.13.4.

Классы могут быть абстрактными; §R.10.3.

Для пользовательских типов префиксные и постфиксные операции различаются.

Шаблоны типов; §R.14.

Управление особыми ситуациями; §R.15.

R.18.2 C++ и ANSI C

Вообще язык C++ обладает большими возможностями и налагает меньше ограничений, чем ANSI C, поэтому большинство конструкций ANSI C являются законными для С++, причем смысл их не меняется. Исключения сводится к следующему:

Любая программа на ANSI C, использующая в качестве идентификаторов следующие служебные слова С++, не является программой на С++; §R.2.4:

>       asm       catch      class       delete     friend

>       inline    new        operator    private    protected

>       public    template   try         this       virtual

>       throw

Хотя это считается устаревшем в ANSI C, реализация С может налагать драконовские ограничения на длину идентификаторов; в реализациях C++ это недопустимо; §R.2.3.

В C++ функция должна быть описана прежде, чем ее можно вызвать; §R.5.2.2.

Описание f(); в C++ означает, что функция f не имеет параметров (§R.8.2.5), а в С это означает, что f может иметь любое число параметров любого типа. Такое описание считается устаревшим в ANSI C.

В ANSI C можно несколько раз описать без спецификации extern глобальный объект данных, в C++ возможно только одно его определение; §R.3.3

В C++ класс не может иметь тоже имя, что и имя typedef, относящееся в той же области видимости к другому типу; §R.9.1.

В ANSI C операнд типа void* можно использовать в правой части присваивания, а также при инициализации переменной типа указателя на произвольный тип; в C++ это невозможно §R.7.1.6.

В ANSI C возможны команды переходов, обходящие инициализацию; в C++ это невозможно.

В ANSI C по умолчанию глобальный объект типа const подлежит внешнему связыванию; для C++ это не так; §R.3.3.

Определения функций в "старом" стиле и вызовы неописанных функций считаются в C++ анахронизмами, которые не обязательно должны поддерживаться любой реализацией; §R.18.3.1. В ANSI C они просто считаются устаревшими.

В C++ структура (struct) образует область видимости (§R.3.2); В ANSI C структура, перечисление или элемент перечисления, описанные в структуре поднимаются в область видимости самой структуры.

Присваивание объекту типа перечисления значения, не принадлежащего перечислению, считается в C++ анахронизмом и не должно поддерживаться во всех реализациях; §R.7.2. В ANSI C рекомендуется для таких присваиваний выдавать предупреждение.

Строки, инициализирующие символьные массивы, не могут быть длиннее этих массивов; §R.8.4.2.

Тип символьной константы в C++ есть char (§R.2.5.2) и int в ANSI C.

Тип элемента перечисления есть тип этого перечисления в C++ (§R.7.2) и тип int в ANSI C.

Кроме того, стандарт ANSI для С допускает значительные различия в допустимых реализациях языка, что может привести к еще большим расхождениям между реализациями C++ и С. В частности, в некоторых реализациях С могут быть допустимы некоторые несовместимые описания. В C++ требуется совместимость даже для разных единиц трансляции; §R.3.3.

R.18.2.1 Как бороться с расхождениями

В общем случае программа на C++ использует многие возможности, отсутствующие в ANSI C. Для такой программы незначительные расхождения, перечисленные в §R.18.2, явно перекрываются расширениями в С++. Когда C++ и ANSI C должны иметь общие заголовочные файлы, нужно позаботиться, чтобы эти файлы представляли текст на общем подмножестве этих языков.

Нельзя пользоваться специфическими возможностями C++ такими, как классы, перегрузка и т.п.

Нельзя использовать одно имя для обозначения типа структуры и другого типа.

Функцию без параметров следует описывать как f(void), а не просто f().

Глобальные объекты типа const следует явно специфицировать как static или extern.

Для разделения частей программы на ANSI C и C++ можно использовать условную трансляцию с предописанным именем __cplusplus.

Функции, которые могут вызываться из программ на обеих языках, должны быть явно описаны, как функции, подлежащие связыванию с С.

R.18.3 Анахронизм

Реализация C++ может включать перечисленные здесь расширения, чтобы облегчить использование программы на С, или чтобы упростить переход с более ранних версий С++. Отметим, что с каждым расширением связаны нежелательные последствия. Если реализация предоставляет такое расширение, то она должно также предоставлять возможность убедиться в отсутствии этих последствий для исходной программы. Реализация C++ не обязана обеспечивать эти расширения.

При описании или определении функции можно использовать слово overload в конструкции спецификация-описания (§R.7). Если оно используется в спецификации-описания, то считается служебным словом и его нельзя использовать как идентификатор.

Определение статического члена класса, представляющего данные, для которого дана стандартная инициализация нулями (§R.8.4, §R.9.4), может быть опущено.


Еще от автора Бьерн Страуструп
C++
C++

С++ – это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.