Вопрос по c++, c, merge, call – Вызов функций C ++ из файла C

11

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

Когда вы не управляете библиотекой C ++:stackoverflow.com/questions/2744181/… Ciro Santilli 新疆改造中心 六四事件 法轮功
Стандартный заголовок C ++<iostream> не имеет.h, Ваш компилятор может иметь<iostream.h> как расширение, но его содержание непредсказуемо.printf например, обычно происходит от<cstdio> MSalters

Ваш Ответ

2   ответа
2

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 & quot; example.h & quot; из example.cpp, так что перед его реализацией компилятор уже знает, что он должен следовать соглашению Си.

@ user1702375 - Вы не хотите & quot;extern "C" появляться в.c файл. Вот почему люди ставят#ifdef __cplusplus вокруг него в заголовках.
Вы абсолютно правы. Когда я пишу ту же программу, но вместо этого пишу свой основной как & quot; main.cpp & quot; и добавит extern & quot; c & quot; перед helloWorld () или добавьте & quot; example.h & quot; к этому, это работает. Но все же, когда я добавляю "example.h" или extern "C"; в моем & quot; main.c & quot; файл, он просто не работает. user1702375
Да, может быть, я просто объяснил не теми словами. Я имел в виду, что когда у меня есть main как cpp-код, main.cpp & quot; это правило работает. Но когда у меня есть мой main как код c, «main.c» это все еще не работает. Хотя я добавил example.h в мой & quot; example.cpp & quot; также. user1702375
14

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

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

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

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

@MSalters - в этом случае это необходимо (или: это мое рекомендованное однострочное исправление), и именно поэтому ссылка терпит неудачу, я нахожусь в процессе ввода объяснения.
Технически это не нужно. Это очень хорошая практика.
@MSalters - это правда, и я знаю это, но я собирался получить краткую рекомендацию и затем дать подробное объяснение ... Таким образом, они могут получить быстрый ответ, если им это нужно, но также продолжают читать, чтобы увидеть, как это происходит. к этому.
@asveikau +1, но эту часть можно сформулировать лучше:…it doesn't know to compile it as a C function (и из остальной части вашего ответа я знаю, что вы знаете, что это связано с именами, а не с компиляцией).
Отсутствуетextern "C" действительно правильный ответ, но юридически это может также появиться в .cpp

Похожие вопросы