Вызов функций C ++ из файла C

Я довольно новичок в 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, В чем проблема?

11

Решение

Короткий ответ:

example.cpp должны включать example.h,

Более длинный ответ:

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

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

14

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

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.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector