Возможно ли, что метод C не может быть включен в проект C ++?

Я знаю, что могу включить методы C в проект C ++, используя extern "C" вещь. Но давайте теперь предположим, что я думаю о создании проекта C ++, который бы использовал довольно много методов C, исходящих как от созданных мной библиотек, так и от библиотек других людей / компаний, чьи детали разработки и спецификации компиляции я просто не в курсе.

Возможно ли, что некоторые из этих методов библиотек C с неизвестными деталями компиляции и конфигурации не могли быть включены в мой проект C ++ с extern "C"? Или все методы C обязательно на 100% совместимы с кодом C ++, если extern "C" используется?

1

Решение

Возможно, что некоторые функции, экспортируемые C, используют имена, которые конфликтуют с ключевыми словами C ++. Вы не сможете объявить тех, кто использует extern "C",

Функции, экспортируемые ассемблером, могут даже использовать имена, конфликтующие с ключевыми словами C.

Те и функции, объявленные как статические, все еще могут вызываться через указатель на функцию, если библиотека дает вам возможность получить ее.

Заголовки могут не обрабатываться в режиме C ++ по тем же причинам — например, restrict ключевое слово.

Помимо проблем с именами, C ++ полностью поддерживает соглашение о вызовах C. Это то что extern "C" это все о.

5

Другие решения

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 ++.

2

Хотя довольно маловероятно, одна возможная проблема, которая может возникнуть с extern "C" на месте, когда указатель функции объявлен extern "C" указывает на функцию C ++, которая не объявлена extern "C", Смотрите последнюю часть этого страница Больше подробностей.

1
По вопросам рекламы [email protected]