Смешивание кода C и C ++ с пользовательским определением & quot; typename () & quot; функция в 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

2

Решение

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

Файл: 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
7

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

Вот как вы можете разделить вещи так, чтобы они правильно компилировались и связывались. Исходный файл 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()'s 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();
}
5

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

3

Вряд ли есть официальный ответ на этот вопрос. Причина в том, что 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

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

3

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

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

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