Стандарт C ++ не определяет, как компиляторы должны называть символы в своих объектных файлах (например, Foo::bar()
может закончиться как __clsFoo_fncBar
или некоторый гоблид). Стандарт C делает, и он почти всегда отличается от того, как это делают компиляторы C ++ (C не должен иметь дело с классами, пространствами имен, перегрузками и т. Д.).
В результате, когда вы ссылаетесь на объектный файл, который был выведен компилятором C, вы должны указать своему компилятору C ++ искать символы с именами, которые соответствуют стандарту C. По сути, вы помещаете его в «режим C». Это то, что делает "C"
часть extern "C"
.
(В качестве альтернативы вы можете также объявлять функции или переменные, которые могут использоваться внешним объектным файлом C. В этом случае это означает экспорт этих символов способом C.)