Пространства имён в C++ и префиксы имён в C
В этом уроке вы узнаете, как избежать одинаковых имён функций в большой программе: с помощью пространств имён (namespace) в C++ и соглашения о префиксах в C.
Введение
В большой программе или при использовании многих библиотек две функции легко могут получить одно и то же имя. C++ решает эту проблему с помощью пространств имён (namespace), отдельных областей для имён. В C пространств имён нет, поэтому библиотеки на C обычно добавляют к именам префикс (prefix), например math_square.
Главное
- Поймите, как это делается в C, прежде чем изучать абстракции C++.
- Выражайте владение ресурсами через RAII и семантику значений (value semantics).
- Используйте типобезопасные средства C++ вместо макросов и приведений типов.
Примеры кода на C и C++
#include <stdio.h>
int math_square(int value) {
return value * value;
}
int main(void) {
printf("%d\n", math_square(7));
}
49
#include <iostream>
namespace math {
int square(int value) {
return value * value;
}
}
int main() {
std::cout << math::square(7) << '\n';
}
49
Сравнение C и C++
В C префикс math_ - лишь соглашение об именах, которое целиком зависит от аккуратности программиста. В C++ функция square находится в пространстве имён math и вызывается по полному имени math::square. Компилятор гарантирует, что имена из разных пространств имён не конфликтуют, и позволяет давать слишком длинным пространствам имён псевдонимы.
C использует соглашения об именах, обратные вызовы, макросы и struct с контекстом.
C++ предлагает абстракции с чёткими границами, безопасные по типам и обычно без дополнительных затрат при выполнении.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Сначала напишите механизм на C, а затем используйте аналогичную возможность C++.
- Замените ручное освобождение ресурсов на RAII.
- Проверьте, не вызывает ли эта возможность выделение памяти или вызовы виртуальных функций.