Если вы должны использовать C для интерфейсов, используйте C++ в коде вызова таких интерфейсов
Причина
C++ более выразителен, чем C, и обеспечивает лучшую поддержку для многих типов программирования.
Пример
Например, для использования библиотеки C третьей стороны или интерфейса системы C, определите низкоуровневый интерфейс в общем подмножестве C и C++ для лучшей проверки типов. Когда это возможно, инкапсулируйте низкоуровневый интерфейс в интерфейс, который следует руководствам C++ (для лучшей абстракции, безопасности памяти и безопасности ресурсов) и используйте этот интерфейс C++ в коде C++.
Пример
Вы можете вызывать C из C++:
// на C:
double sqrt(double);
// на C++:
extern "C" double sqrt(double);
sqrt(2);
Пример
Вы можете вызывать C++ из C:
// на C:
X call_f(struct Y*, int);
// на C++:
extern "C" X call_f(Y* p, int i)
{
return p->f(i); // возможно вызов виртуальной функции
}
Применение
Не требуется
SF: Исходные файлы
Различайте объявления (используемые как интерфейсы) и определения (используемые как реализации). Используйте файлы заголовков для представления интерфейсов и для подчёркивания логической структуры.
Резюме правил исходных файлов:
- SF.1: Используйте суффикс
.cppдля файлов кода и.hдля файлов интерфейса, если ваш проект уже не следует другому соглашению - SF.2: Файл заголовка не должен содержать определения объектов или определения функций без встраивания
- SF.3: Используйте файлы заголовков для всех объявлений, используемых в нескольких исходных файлах
- SF.4: Включите файлы заголовков перед другими объявлениями в файле
- SF.5: Файл
.cppдолжен включать файл(ы) заголовка, который определяет его интерфейс - SF.6: Используйте директивы
using namespaceдля перехода, для библиотек фундамента (таких какstd), или в пределах локальной области (только) - SF.7: Не пишите
using namespaceв глобальной области в файле заголовка - SF.8: Используйте
#includeзащиту для всех файлов заголовков - SF.9: Избегайте циклических зависимостей между исходными файлами
- SF.10: Избегайте зависимостей от неявно
#included имён - SF.11: Файлы заголовков должны быть самодостаточными
- SF.12: Предпочитайте форму в кавычках
#includeдля файлов, относящихся к включаемому файлу, и форму с угловыми скобками везде - SF.13: Используйте переносимые идентификаторы заголовков в
#includeвыражениях