Использование класса C ++ внутри C - PullRequest
0 голосов
/ 30 ноября 2018

Я новичок в C ++.Я занимаюсь созданием файла библиотеки обратного вызова на C. Этот файл будет использоваться в приложении C ++.Файл C будет иметь только три функции, и, к сожалению, я не хочу создавать для этого другой файл / класс cpp из-за накладных расходов, а также классы должны быть только в файле cpp.пожалуйста, пройдите через фрагмент кода.Файл C XYZ.c использует класс ABC.hpp в своей функции.

Allheader.hpp

#include<iostream>
 .
 .

ABC.hpp

#include "Allheader.hpp"
  .
  .

XYZ.h

func1();
func2();
func3();

XYZ.c

include "XYZ.h"
include "ABC.hpp"

func1()
{
   using class of ABC here
}

func2() {}
func3() {}

MyApplication.cpp

extern "C" { #include "XYZ.h"} 
   .
   .

Итак, этот файл XYZ.c / XYZ.h будет использоваться в приложении My CPP какобратный вызов.

Компиляция с g ++

Что я сделал.

  1. Скомпилировано: отображается ошибка, нет файла iostream.
  2. Когда я компилировал файл C и использовал внутри него C ++, начал использовать __BEGIN_DECLS

    и кодв файле XYZ.c находился в блоке

    __ BEGIN_DECLS __END_DECLS

    , предложенном коллегой.Но ошибка все та же.

Как я могу использовать C ++ внутри функции C?Пожалуйста, предложите любое решение.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

После нескольких дней поиска параллельно с моей работой.Я могу это сделать.Как я сказал в своем требовании, мне нужен файл Callback C, который содержит некоторые функции, и нам нужно его использовать, потому что нам не нужен файл cpp.(Потому что в нашем приложении cpp-файл будет содержать Class и нам не нужен класс для обратных вызовов).

Теперь что я сделал:

Приложение использует cmake для сборки.Поэтому я добавил

set_source_files_properties(${BASE_DIR}/path/to/XYZ.c PROPERTIES LANGUAGE CXX)

в CMakeLists.txt

Это дает компилятору понять, что он должен скомпилировать файл XYZ.c как файл cpp.

В основном, если вы "man g ++", тогда написано, что исходные файлы

C ++ обычно используют один из суффиксов .C, .cc, .cpp, .CPP, .c ++, .cp или.CXX;Заголовочные файлы C ++ часто используют .hh, .hpp, .H или (для общего кода шаблона) .tcc;и предварительно обработанные файлы C ++ используют суффикс .ii.GCC распознает файлы с этими именами и компилирует их как программы на C ++, даже если вы вызываете компилятор так же, как и для компиляции программ на C (обычно с именем gcc).

И это то, что мне нужно.Просто сказать компилятору, что Compile похож на cpp.

Заключение:

Это работает, и да, это не способ вызова класса C ++ из C. Как @Andrew сказал C иC ++ - это разные языки.Это своего рода требование, которому я должен следовать, и я новичок в этом, поэтому я потратил некоторое время на поиск всего этого.

Спасибо @Andrew & @Galik за ваше время.

0 голосов
/ 30 ноября 2018

Вы не можете скомпилировать код C ++ как код C.Этот код C недействителен:

#include "XYZ.h"
#include "ABC.hpp"  // this is wrong

func1()
{
   using class of ABC here  // this is also wrong (and incomplete...)
}

func2() {}
func3() {}

Опять же - вы просто не можете этого сделать.C и C ++ - это разные языки.Вы также можете попробовать спросить «Почему я не могу скомпилировать Java или Python с помощью компилятора C», и ответ будет таким же: «Потому что это не C».

Вы можете вызывать функции C ++ с помощью * 1006.* связь с C.

Из файла C ++:

extern "C" void calledFromC()
{
     // C++ code
}

А затем в заголовке C ++ это может быть #include 'd от C:

#ifdef __cplusplus
extern "C" {
#endif

void calledFromC();

#ifdef __cplusplus
}
#endif
...