Совместное использование переменной между дилеммой библиотек C и C ++ - PullRequest
4 голосов
/ 03 мая 2011

У меня простая проблема. У меня есть две библиотеки, одна скомпилирована в C, другая скомпилирована в C ++, где библиотека C связана и загружена библиотекой C ++. Мне нужно объявить экземпляр структуры в библиотеке C, который может читать и писать. Как вы этого достигнете?

Спасибо

РЕДАКТИРОВАТЬ: добавлено, что это должен быть экземпляр структуры, а не просто объявление

Ответы [ 4 ]

8 голосов
/ 03 мая 2011

Вам необходимо создать один заголовочный файл, который включается модулями в библиотеки C и C ++:

#ifndef YOURSTRUCT_H
#define YOURSTRUCT_H

#ifdef __cplusplus
extern "C" {
#endif
    struct YourStruct
    {
        // your contents here
    };
#ifdef __cplusplus
}
#endif
// UPDATE: declare an instance here:
extern YourStruct yourInstance;
#endif

Эта форма файла заголовка означает, что оба компилятора будут рады читать файл заголовка, и оба будут производить одно и то же искажение имени.

Обновление:
Тогда вам нужен файл модуля. Только один. Либо файл C, если он должен быть включен в вашу библиотеку C, либо файл C ++, если он должен быть включен в вашу библиотеку c ++:

#include "yourstruct.h"

YourStruct yourInstance;

Теперь любой клиент глобального экземпляра, будь то клиент C или клиент C ++, должен просто #include "yourstruct.h" и ссылку yourInstance

Обновление:
Как указывает Матье, вам лучше передавать указатели на примеры вокруг. например.

#include "yourstruct.h"

#ifdef __cplusplus
extern "C" {
#endif

void yourFunction(YourStruct* someInstance);

#ifdef __cplusplus
}
#endif
2 голосов
/ 03 мая 2011

Использовать внешнюю спецификацию сцепления С.

#ifdef __cplusplus 
extern "C" {
#endif 

    struct YourStruct
    {


    };
#ifdef __cplusplus 
}
#endif 
1 голос
/ 03 мая 2011
extern struct YourStruct *yourstruct_instance;

В одном из заголовков следует выполнить работу.

0 голосов
/ 03 мая 2011

Экспорт экземпляра структуры из вашей библиотеки c. Пусть библиотека C ++ включает заголовочный файл из библиотеки c.

В файле .h в библиотеке C:

#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) struct MyStruct
{
    // members
}
extern __declspec(dllexport) struct MyStruct myInstance;
#ifdef __cplusplus
}
#endif

В файле .c в библиотеке C:

__declspec(dllexport) struct MyStruct myInstance;

Ваш код на c и c ++ может затем манипулировать myInstance.

См. эту статью для получения дополнительной информации. Также попробуйте создать новый проект C ++ dll и установите флажок «символы экспорта». Это создает dll c ++ с экспортированным классом и экземпляром этого класса. Делать то же самое в c для экспортированной структуры очень похоже.

...