Причина, по которой Дэвид Шцварц говорит, что вам нужен блок extern "C"
, заключается в том, что без внешнего блока "C" компилятор "искажает" имя функции C, которую вы вызываете, в точке, которую вы вызываете.Если вы вызываете функцию C, а не функцию C ++, определение функции в вашей библиотеке не будет иметь искаженного имени, поэтому ваш исполняемый файл не сможет связать.
Это то, что вы хотите, если функция, которую вы вызываетенаписан на C ++, поскольку искажение имени допускает перегрузку имени функции.Типы каждого из параметров функции компактно кодируются в искаженном имени функции.
Изначально искажение имени было предоставлено в C ++, чтобы позволить объектным файлам C ++ связываться с унаследованными компоновщиками, вместо того чтобы предоставлять C ++специализированный компоновщик, который явно поддерживает перегруженные функции.
C не допускает перегрузки имен функций, поэтому имена функций C никогда не искажаются.Чтобы предоставить прототип на C ++ для одной функции C, вы должны сделать следующее:
extern "C" Foo( int theInt );
Если у вас есть весь заголовочный файл, полный прототипов функций C, и вы хотите #include этот заголовок из источника C ++, заключите#include во внешнем блоке C
extern "C" {
#include "Foo.h"
}