Как использовать C-код в С++ - программирование

Как использовать C-код в С++

Небольшой вопрос: Может ли С++ использовать файлы заголовков C в программе?

Это может быть странный вопрос, в основном мне нужно использовать исходный код из другой программы (сделанный на языке C) на С++. Есть ли разница между обоими файлами заголовков вообще? Может быть, если я изменю некоторые библиотеки... Надеюсь, ты поможешь мне.

4b9b3361

Ответ 1

Да, вы можете включить заголовки C в код С++. Нормально добавить это:

#ifdef __cplusplus
extern "C"
{
#endif

// C header here

#ifdef __cplusplus
}
#endif

чтобы компилятор С++ знал, что объявления функций и т.д. должны рассматриваться как C, а не С++.

Ответ 2

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

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

Здесь есть два варианта: вы сами редактируете сам файл заголовка, добавляете

#ifdef __cplusplus 
extern "C" {
#endif

... original content of headerfile goes here. 

#ifdef __cplusplus 
}
#endif

Или, если у вас нет возможности редактировать эти заголовки, вы можете использовать эту форму:

#ifdef __cplusplus 
extern "C" {
#endif
#include <c_header.h>
#ifdef __cplusplus 
}
#endif

Ответ 3

Да, но вам нужно сообщить компилятору С++, что объявления из заголовка C:

extern "C" {
#include "c-header.h"
}

В большинстве заголовков C они уже включены, завернуты в #if defined __cplusplus. Это, возможно, немного странно (синтаксис С++ в заголовке C), но это часто делается для удобства.