Да, C++ изначально был спроектирован таким образом, что любую C-библиотеку можно легко использовать в C++. Конечно, это немного менее верно (в частности, если в библиотеке C используется некоторое ключевое слово C++, например try
или dynamic_cast
, это не сработает, также если код callback, закодированный в C++, переданный в библиотеку C, вызывает некоторое исключение, у вас, вероятно, будет большой беспорядок).
Стандартная практика использовать заголовочный файл C в C++ является
extern "C" {
#include <some_c_header_file.h>
};
и наиболее существующие файлы заголовков C предназначены сотрудничать с C++ на самом деле, содержащим такие вещи, как
#ifdef __cplusplus
extern "C" {
#endif
//// most of the header material goes here, C style
#ifdef __cplusplus
}; // end extern "C"
#endif
В практика, многие стандартные заголовки C имеют эквивалентные заголовки C++, которые обертывают такие вещи, как указано выше (а также в namespace std
). Например, C <stdio.h>
- это C++ <cstdio>
, но вам часто следует выбирать подлинные потоки C++ (<iostream>
), однако printf
-подобные процедуры обычно более localization дружественные, смешанные с gettext(3).
Однако C и C++ - очень разные языки. Вы должны кодировать в идиоматических C++ 11 (с использованием стандартного C++ containers, auto
, closures, RAII, smart pointers, rule of five, SFINAE, exceptions, anonymous functions, ...)
Некоторые стандартные функции C не очень полезны в идиоматических C++. Например, вы вряд ли будут использовать непосредственноmalloc
в подлинной C++ (по крайней мере, предпочитают new
-Какой еще очень низкий уровень и больше не в C++ spirit-, более вероятно, использовать много контейнеров и смарт-указатели без, выполняющих ручное управление с помощью кучи). Но функции POSIX (особенно syscalls(2) ....) весьма полезны в C++. longjmp
, вероятно, несовместим с исключениями C++.
BTW, C++ развил много в этом веке. Не изучайте C++ 98, но, по крайней мере, C++11 (есть огромные различия между ними) и, возможно, C++14. Используйте недавний компилятор (GCC или Clang/LLVM); в декабре 2015 года, это означает, что не менее GCC 5 или Clang/LLVM 3.7. Не забудьте включить все предупреждения & отладочную информацию в компилятор (например g++ -Wall -Wextra -g -std=c++11
)
C++ (это означает, что C++ 11, по крайней мере) является трудно язык программирования, значительно сложнее, чем C является.Для изучения некоторых из них вам понадобятся недели чтения, а также хороший стиль и дисциплина кодирования (вы можете легко написать очень дерьмовый код на C++). Начните с Programming: Principles & Practice Using C++
Я считаю, что если вы знаете только C, чтение SICP (и изучение немного Scheme) перед тем обучения C++ стоит.
Понятие undefined behavior очень важно, как в C, так и, возможно, даже больше в C++. Вам это абсолютно необходимо понять (см. Статью blog on it C.Lattner) и avoid.
Вы также узнаете большой интерес, изучив (и, возможно, способствуя) некоторые существующие free software и его исходный код. Поэтому я рекомендую использовать Linux.
@moooeeeep: Обратите внимание, что вы изменили значение ОП. OP запросил стандартные библиотеки, что является определенным да. Хотя после вашего редактирования он запрашивает C-fucntions, где ответ: «Это зависит от того, как они были реализованы для этого». Я бы предложил повторить эту часть! – dhein
@Zaibis Я подумал, что было бы более интересно включить более общий случай, но вы правы, OP задал вопрос о стандартной библиотеке. Просмотрите мое второе редактирование. – moooeeeep
@moooeeeep: Я в порядке. Надеюсь, что и Nimit: P – dhein