Программирование. Принципы и практика использования C++ Исправленное издание, стр. 385
Остальная часть этой главы посвящена объяснению того, как писать полезные программы без помощи этих свойств. Наши основные советы по использованию языка С++ сводятся к следующему.
• Имитируйте стили программирования, для которых разработаны свойства языка С++, чтобы поддерживать возможности, предусмотренные языком C.
• Когда пишете программу на языке C, считайте его подмножеством языка C++.
• Используйте предупреждения компилятора для проверки аргументов функций.
• Контролируйте стиль программирования на соответствие стандартам, когда пишете большие программы (см. раздел 27.2.2).
Многие детали, касающиеся несовместимости языков С и С++, устарели и носят скорее технический характер. Однако, для того чтобы читать и писать на языке С, вы не обязаны помнить об этом.
• Компилятор сам напомнит вам, если вы станете использовать средства языка С, которых нет в языке C.
• Если вы следуете правилам, перечисленным выше, то вряд ли столкнетесь с чем-либо таким, что в языке С имеет другой смысл по сравнению с языком С++.
В отсутствие всех возможностей языка С++ некоторые средства в языке С приобретают особое значение.
• Массивы и указатели.
• Макросы.
• Оператор
typedef• Оператор
sizeof• Операторы приведения типов.
В этой главе будет приведено несколько примеров использования таких средств.
///* ... *////* ... */27.1.3. Стандартная библиотека языка С
• Класс
vector• Класс
map• Класс
set• Класс
string• Алгоритмы библиотеки STL: например,
sort()find()copy()• Потоки ввода-вывода
iostream• Класс
regexИз-за этого библиотеки языка С часто основаны на массивах, указателях и функциях. К основной части стандартной библиотеки языка С относятся следующие заголовочные файлы.
•
<stdlib.h>malloc()free()•
<stdio.h>•
<string.h>•
<math.h>•
<errno.h><math.h>•
<limits.h>•
<time.h>•
<assert.h>•
<ctype.h>•
<stdbool.h>Полное описание стандартной библиотеки языка С можно найти в соответствующем учебнике, например в книге K&R. Все эти библиотеки (и заголовочные файлы) также доступны и в языке С++.
27.2. Функции
В языке C есть несколько особенностей при работе с функциями.
• Может существовать только одна функция с заданным именем.
• Проверка типов аргументов функции является необязательной.
• Ссылок нет (а значит, нет и механизма передачи аргументов по ссылке).
• Нет функций-членов.
• Нет подставляемых функций (за исключением версии C99).
• Существует альтернативный синтаксис объявления функций.
Помимо этого, все остальное мало отличается от языка С++. Изучим указанные отличия по отдельности.
27.2.1. Отсутствие перегрузки имен функций
Рассмотрим следующий пример:
void print(int); /* печать целого числа */void print(const char*); /* печать строки */ /* ошибка! */Второе объявление является ошибкой, потому что в программе, написанной на языке С, не может быть двух функций с одним и тем же именем. Итак, нам необходимо придумать подходящую пару имен.
void print_int(int); /* печать целого числа int */void print_string(const char*); /* печать строки */Иногда это свойство называют преимуществом: теперь вы не сможете случайно использовать неправильную функцию для вывода целого числа! Очевидно, что нас такой аргумент убедить не сможет, а отсутствие перегруженных функций усложняет реализацию идей обобщенного программирования, поскольку они основаны на семантически похожих функциях, имеющих одинаковые имена.
27.2.2. Проверка типов аргументов функций
Рассмотрим следующий пример:
int main(){ f(2);