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

11

Я довольно новичок в C и C ++. Но у меня есть некоторые функции C ++, которые мне нужно вызывать из C. Я сделал пример того, что мне нужно сделать

main.c:

#include "example.h"      
#include 

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 

void helloWorld(){
    printf("hello from CPP");
} 

Это просто нет работа. Я все еще получаю ошибку неопределенной ссылки на_helloWorld в моемmain.c, В чем проблема?

Когда ты неуправлять библиотекой C ++:stackoverflow.com/questions/2744181/... Ciro Santilli 新疆改造中心996ICU六四事件
Стандартный заголовок C ++ Безразлично»не иметь.h, Ваш компилятор может иметь как расширение, но его содержание непредсказуемо.printf например, обычно происходит от 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 "example.h» из example.cpp, так что перед его реализацией компилятор уже знает, что он должен следовать соглашению Си.

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

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

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

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

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

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

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