Смешивание кода C и C++ с пользовательской функцией "typename()" в C

Я пытаюсь написать код C++, где я вызываю функцию C, позволяет сказать hello_world() который в свою очередь вызывает определенную пользователем функцию typename(). Когда я включаю свой код C в C++, есть ошибка компиляции, я знаю, что typename является ключевым словом в C++, но затем для включения кода C, я использую

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

в моем C++ коде, и все еще есть ошибка во время компиляции, любые предложения, чтобы избежать этого и скомпилировать код, я был бы благодарен.

Я не могу изменить имя определенной пользователем функции typename() для другого имени. так как идти...?

Ошибки как таковые: In file included from New_test.cpp:19:0:../tools/symbol.h:38:14: error: expected unqualified-id before 'typename../tools/symbol.h:38:14: error: expected initializer before 'typename In file included from New_test.cpp:604:0: /usr/include/i386-linux-gnu/sys/poll.h: In function 'int readpacket(channel*, void*, size_t): /usr/include/i386-linux-gnu/sys/poll.h:48:1: error: expected unqualified-id before string constant New_test.cpp:612:52: error: 'poll was not declared in this scope

5 ответов

Вероятно, вам нужно что-то подобное в вашем файле заголовка:

Файл: common_header.h

#ifdef __cplusplus
extern "C" {
#endif

extern void newname_typename();

#ifdef __cplusplus
}
#endif

а затем блок компиляции только C:

#include "common_header.h"
#include "hello_world.h"
void newname_typename() {
 typename();
}

и в C++:

#include "common_header.h"

void do_stuff() {
 newname_typename();
}

и вам нужно убедиться, что ваш Makefile завершил выполнение следующих действий:

gcc c_only_code.c -o something1.o
g++ cplus_only_code.cxx -o something2.o
gcc something1.o something2.o <other stuff=""> -o binary 
</other>


Здесь вы можете разбить вещи так, чтобы они правильно компилировались и правильно связывались. Исходному файлу C++ не нужно знать, что существует функция, называемая typename().

Файл ' some_c.c ':

#include "some_c.h"

void typename(); /* This declaration will suffice. */

void hello_world()
{
 typename();
}

Файл ' some_c.h '

/* References to typename() declaration must be deleted from this
** header file. If it turns out that there are some other parts of the
** header file which somehow depend on the typename() declaration, you
** must separate this into multiple header files. 
*/
void hello_world();

Файл ' some_cpp.cpp ':

/* Arguably this should show up in some_c.h, protected by
** #ifdef __cplusplus barriers. But this should work too:
*/
extern "C" {
#include "some_c.h"
}

void SomeClass::someMethod()
{
 hello_world();
}


Маловероятно, что есть официальный ответ на этот вопрос. Причина в том, что extern "C" директива extern "C" имеет официальное использование и намерение, и вся авторитетная документация обсудит это использование и намерение. Вы пытаетесь использовать extern "C" для чего-то, для чего он не предназначен. Официального документа, который обсуждает все непреднамеренные случаи использования, будет трудно найти. Я утверждаю, что такой документ будет бесконечно длинным.

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

http://en.wikipedia.org/wiki/Extern_%22C%22#Linking_C_and_C.2B.2B_code

Поэтому, учитывая следующие требования

1) a function named 'typename' exists in a C source file
2) the function cannot be renamed
3) the function must be callable from a C++ source file

единственным решением является создание файла моста, полностью объясненного в сообщении Эндрю Макдоннеллом.


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


Это для тех, у кого есть одна и та же проблема: для вызова функции C с именем функции, аналогичным определенному ключевому слову в C++, следует использовать выражение extern "C" {/* function */}, а также вам нужно иметь Общая библиотека.

Спасибо вам всем...!!!

licensed under cc by-sa 3.0 with attribution.