Я знаю, что могу включить методы C в проект C ++, используя extern "C"
вещь. Но давайте теперь предположим, что я думаю о создании проекта C ++, который бы использовал довольно много методов C, исходящих как от созданных мной библиотек, так и от библиотек других людей / компаний, чьи детали разработки и спецификации компиляции я просто не в курсе.
Возможно ли, что некоторые из этих методов библиотек C с неизвестными деталями компиляции и конфигурации не могли быть включены в мой проект C ++ с extern "C"
? Или все методы C обязательно на 100% совместимы с кодом C ++, если extern "C"
используется?
Возможно, что некоторые функции, экспортируемые C, используют имена, которые конфликтуют с ключевыми словами C ++. Вы не сможете объявить тех, кто использует extern "C"
,
Функции, экспортируемые ассемблером, могут даже использовать имена, конфликтующие с ключевыми словами C.
Те и функции, объявленные как статические, все еще могут вызываться через указатель на функцию, если библиотека дает вам возможность получить ее.
Заголовки могут не обрабатываться в режиме C ++ по тем же причинам — например, restrict
ключевое слово.
Помимо проблем с именами, C ++ полностью поддерживает соглашение о вызовах C. Это то что extern "C"
это все о.
C имеет конструкции для интерфейсов, которые не совместимы с C ++, в частности массивы переменной длины. В современном C вы бы написали
void matMult(size_t n, size_t k, size_t m, double A[n][k], double B[k][m], double C[n][m]);
этот интерфейс не может быть включен как таковой в модули компиляции C ++.
Хотя довольно маловероятно, одна возможная проблема, которая может возникнуть с extern "C"
на месте, когда указатель функции объявлен extern "C"
указывает на функцию C ++, которая не объявлена extern "C"
, Смотрите последнюю часть этого страница Больше подробностей.