Могу ли я использовать библиотеки C ++ в программе на C? - PullRequest
3 голосов
/ 01 ноября 2009

Я пишу программу на C, но я хотел бы использовать динамические библиотеки, такие как вектор. Можно ли использовать библиотеки C ++ в программе на C?

Ответы [ 5 ]

11 голосов
/ 01 ноября 2009

Не std::vector, нет. Все, что связано с шаблонами, верно.

В целом, использование кода на C ++ неинтересно, но это возможно. Вы должны обернуть классы в простые функции, не относящиеся к классам, которые может вызывать ваш код C, поскольку C не выполняет классы. Чтобы сделать эти функции пригодными для использования из C, вы затем оборачиваете их объявлением extern "C", чтобы сообщить компилятору C ++ не выполнять искажение имен.

Затем вы можете скомпилировать функции-оболочки с помощью компилятора C ++ и создать библиотеку, с которой ваша программа на C может ссылаться. Вот очень простой пример:

// cout.cpp - Compile this with a C++ compiler
#include <iostream>

extern "C" {
    void print_cout(const char *str) {
        std::cout << str << std::endl;
    }
}

/* print.c - Compile this with a C compiler */
void print_cout(const char *);

int main(void) {
    print_cout("hello world!");
    return 0;
}
2 голосов
/ 01 ноября 2009

Кроме того, Как смешивать C и C ++ имеет отличные советы по теме.

1 голос
/ 01 ноября 2009

Вы можете, если ваш компилятор компилирует C ++. Я бы сказал, что в большинстве случаев, когда вы используете компилятор, особенно если вы используете gcc.

Большинство IDE позволяют вам создавать новое приложение C ++, которое затем вы можете написать код на простом C и использовать объекты C ++, когда захотите.

Вы можете сделать это, потому что C ++ является надмножеством C. Это означает, что C ++ включает в себя все функции C и добавляет дополнительные функции поверх C.

1 голос
/ 01 ноября 2009

std::vector - это шаблон класса. Он опирается на специальный синтаксис, который C ++ обеспечивает для .

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

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

1 голос
/ 01 ноября 2009

Да, если вы компилируете его с помощью компилятора C ++. Обратите внимание, что теперь это не программа на C, а программа на C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...