Современный C++ и альтернативы на C

Пространства имён в C++ и префиксы имён в C

В этом уроке вы узнаете, как избежать одинаковых имён функций в большой программе: с помощью пространств имён (namespace) в C++ и соглашения о префиксах в C.

Введение

В большой программе или при использовании многих библиотек две функции легко могут получить одно и то же имя. C++ решает эту проблему с помощью пространств имён (namespace), отдельных областей для имён. В C пространств имён нет, поэтому библиотеки на C обычно добавляют к именам префикс (prefix), например math_square.

Главное

  • Поймите, как это делается в C, прежде чем изучать абстракции C++.
  • Выражайте владение ресурсами через RAII и семантику значений (value semantics).
  • Используйте типобезопасные средства C++ вместо макросов и приведений типов.

Примеры кода на C и C++

C
Запустить →
main.c
#include <stdio.h>

int math_square(int value) {
    return value * value;
}

int main(void) {
    printf("%d\n", math_square(7));
}
Результат выполнения
49
C++
Запустить →
main.cpp
#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

C использует соглашения об именах, обратные вызовы, макросы и struct с контекстом.

C++

C++ предлагает абстракции с чёткими границами, безопасные по типам и обычно без дополнительных затрат при выполнении.

Упражнения для практики

Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.

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