Я изо всех сил пытался решить проблему с проектом, над которым я работаю.
Предположим, у меня есть несколько файлов:
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 вопроса:
В этом случае у меня не работает связь между 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);
Очевидно, я сделал что-то не так и не могу понять, что.
Что я должен изменить, чтобы он правильно компилировался?
io_record
не распознал функции от record_sll
когда я их использовал.io_record
знает их.Заранее спасибо за помощь, надеюсь, я смогу это исправить в ближайшее время.
С точки зрения 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 ++ на эта страница часто задаваемых вопросов.
Других решений пока нет …