Вызов функции в файле .cpp из файла .c

Я изо всех сил пытался решить проблему с проектом, над которым я работаю.
Предположим, у меня есть несколько файлов:

reflection.h
sll_insert.c
record_sll.c
io_recorder.cpp

все вышеупомянутые файлы cpp и c используют:

#include "reflection.h"

И в "reflection.h" являются следующие декларации:

extern void io_recorder_fun_entry(char * name, TypedObject args[], int len);

extern void io_recorder_fun_exit(char * name, TypedObject args[], int len);

Эти две функции реализованы в "io_recorder.cpp" и они используют другую функцию из "io_recorder.cpp" называется io_record,

Сейчас в "io_recorder.cpp"две функции следующие:

extern "C" void io_recorder_fun_entry(char * name, TypedObject args[], int len) {
cout << "Entering function "<< name << endl;
io_record(args, len);
}

extern "C" void io_recorder_fun_exit(char * name, TypedObject args[], int len) {
cout << "Exiting function "<< name << endl;
io_record(args, len);

}

Когда в io_record, there are calls being made to several functions declared in reflection.h and implemented in«Record_sll.c» `.

У меня есть 2 вопроса:

  1. В этом случае у меня не работает связь между C и C ++ (раньше я экспериментировал с другими файлами, и, кажется, раньше это работало).
    При попытке компиляции я получаю сообщения об ошибках:

    io_recorder.cpp: In function ‘void io_recorder_fun_entry(char*, TypedObject*, int)’:

    io_recorder.cpp:61:79: error: conflicting declaration of ‘void io_recorder_fun_entry(char*, TypedObject*, int)’ with ‘C’ linkage
    tern "C" void io_recorder_fun_entry(char * name, TypedObject args[], int len) {

    В файле из io_recorder.cpp:4:0:
    reflection.h:32:13: note: previous declaration with ‘C++’ linkage
    extern void io_recorder_fun_entry(char * name, TypedObject args[], int len);

Очевидно, я сделал что-то не так и не могу понять, что.
Что я должен изменить, чтобы он правильно компилировался?

  1. В предыдущих ошибках оказалось, что io_record не распознал функции от record_sll когда я их использовал.
    Это как-то связано с ошибками из вопроса 1? Если нет, что я должен сделать, чтобы убедиться, io_record знает их.

Заранее спасибо за помощь, надеюсь, я смогу это исправить в ближайшее время.

1

Решение

С точки зрения C ++, у вас есть противоречивое определение:

  • в вашем заголовке вы объявляете обе функции как обычные функции c ++ (т.е. никаких особых соглашений о вызовах)
  • в теле вы определяете функцию как использование соглашения о вызове C

Это проблема, потому что во всех блоках компиляции, использующих ваш заголовок, компилятор будет генерировать код, используя последовательность вызова c ++, не зная, что ваши тела функций используют другую последовательность вызова. Отсюда и сообщение об ошибке.

Чтобы решить эту проблему, вы должны объявить функции в обоих случаях как extern "C",

С точки зрения С Тем не менее extern "C" синтаксис не распознан. Поэтому, если вы хотите использовать один и тот же заголовок для C ++ и C, потребуется дополнительная гимнастика с условной компиляцией:

#ifdef __cplusplus
extern "C" {  // this line will be compiled only if included in a .cpp file and not in a .c
#endif
// your c function declaration go here without the extern "C"#ifdef __cplusplus
}
#endif

Вы найдете дополнительную информацию о смешивание C и C ++ на эта страница часто задаваемых вопросов.

3

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

Других решений пока нет …

По вопросам рекламы [email protected]