Первое правильно; системные заголовки (и большинство других заголовков)
могут быть включены только в глобальную область, вне каких-либо пространств имен, классов,
функции или блоки спецификации связи. Есть вероятные вещи в
<iostream>
, что было бы недопустимо в extern "C"
, и даже если
не было, название искажения для extern "C"
почти наверняка
отличается от C ++, и сама библиотека была скомпилирована
как extern "C++"
.
Как вы определили f
? Это может быть похожая проблема: если источник
файл скомпилирует его как extern "C++"
функцию, тогда имя будет
искажено иначе, чем это было в клиентских файлах, которые скомпилировали его
extern "C"
функция.
Общая политика здесь заключается в обработке заголовков и функции
определения / декларации так же, как вы обычно делаете, за исключением того, что
вы гарантируете, что заголовок может быть включен как в C, так и в C ++,
e.g.:
#if __cplusplus
extern "C" {
#endif
void f();
// Other `extern "C"` functions...
#if __cplusplus
}
#endif
Затем включите этот заголовок во все файлы, где используется функция f()
,
и в файле, где он определен.