Я довольно новичок в C и C ++. Но у меня есть некоторые функции C ++, которые мне нужно вызывать из C. Я сделал пример того, что мне нужно сделать
main.c:
#include "example.h"#include <stdio.h>
int main(){
helloWorld();
return 0;
}
example.h:
#ifndef HEADER_FILE
#define HEADER_FILE
#ifdef __cplusplus
extern "C" {
#endif
void helloWorld();
#ifdef __cplusplus
}
#endif
#endif
example.cpp:
#include <iostream.h>
void helloWorld(){
printf("hello from CPP");
}
Это просто не работает. Я все еще получаю ошибку неопределенной ссылки на _helloWorld
в моем main.c
, В чем проблема?
Короткий ответ:
example.cpp
должны включать example.h
,
Более длинный ответ:
Когда вы объявляете функцию в C ++, она имеет связь C ++ и соглашения о вызовах. (На практике самая важная особенность этого название искажения — процесс, с помощью которого компилятор C ++ изменяет имя символа, чтобы вы могли иметь функции с одинаковыми именами, которые различаются по типам параметров.) extern "C"
(присутствует в вашем заголовочном файле) — ваш способ обойти это — он указывает, что это функция C, вызываемая из кода C, например. не искалеченный
У тебя есть extern "C"
в вашем заголовочном файле, который является хорошим началом, но ваш файл C ++ не включает его и не имеет extern "C"
в объявлении, поэтому он не знает, чтобы скомпилировать его как функцию C.
extern "C"
говорит C ++, что объявленная функция должна использовать C ABI (двоичный интерфейс приложения), следовательно, независимо от того, является ли язык C или C ++, ваш void HelloWorld()
всегда видно снаружи, как это C.
Но вы реализовали его в файле cpp, как будто это C ++, а C не знает об этом.
Вы должны сделать прототип HelloWorld
согласован для C и C ++, поэтому файл cpp должен объявить его как extern "C" void Helloworld() { /*your code here*/ }
или просто #include «example.h» из example.cpp, так что перед его реализацией компилятор уже знает, что он должен следовать соглашению C.