В ссылке: Связывание скомпилированной статической библиотеки C с программой C ++ - PullRequest
0 голосов
/ 27 июня 2018

Stackoverflow не позволяет мне комментировать, потому что я новичок.

Заимствуя заголовок из размещенного вопроса здесь , в принятом решении говорится, что вы должны изменить заголовочный файл C, используя #ifdef __cplusplus и extern "C". У меня точно такой же вопрос, но мне предоставили библиотеку C, содержащую более 100 .h заголовочных файлов и .c C программных файлов, и теперь я должен использовать библиотеку C ++, чтобы мой main() был на C ++.

Так что теперь мне нужно добавить эти модификации в каждый из этих заголовочных файлов C или есть какой-то другой подход? Мой main() находится в .cpp файле, который будет использовать функции из этой библиотеки C.

EDIT Этот вопрос был решен. Я хочу, чтобы этот вопрос был закрыт или удален.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

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

Более того, нет, вам не нужно изменять существующие заголовочные файлы. Файлы C ++, которые ссылаются на вашу библиотеку C и, следовательно, включают в себя некоторые из ее заголовков, могут обернуть соответствующие операторы #include в блок extern "C" для решения проблемы.

0 голосов
/ 27 июня 2018

Вам не нужно изменять какие-либо заголовки. Все, что необходимо, - это обернуть все объявления C в extern C {}. Вы можете сделать это так же хорошо в вашем cpp файле:

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

int main() {
    std::cout << "This is C++ code\n";
}

Может быть полезно создать заголовочный файл, который просто включает заголовки C с привязкой C:

// c_header.hpp
#pragma once

#ifdef __cplusplus
extern "C" {
#endif 

#include "c_header_1.h"
#include "c_header_2.h"

#ifdef __cplusplus
}
#endif

// main.cpp
#include "c_header.hpp" // extern "C" {} already handled for you
...