2015-12-16 6 views
30

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

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

+3

@moooeeeep: Обратите внимание, что вы изменили значение ОП. OP запросил стандартные библиотеки, что является определенным да. Хотя после вашего редактирования он запрашивает C-fucntions, где ответ: «Это зависит от того, как они были реализованы для этого». Я бы предложил повторить эту часть! – dhein

+1

@Zaibis Я подумал, что было бы более интересно включить более общий случай, но вы правы, OP задал вопрос о стандартной библиотеке. Просмотрите мое второе редактирование. – moooeeeep

+0

@moooeeeep: Я в порядке. Надеюсь, что и Nimit: P – dhein

ответ

48

Да, 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.

+1

И если вы хотите использовать библиотеку C, которая, например, поле struct с именем 'try', вы можете просто' #define try try'' или подобное, прежде чем вы '# include' его. –

+3

@Claudio. C++-экземпляры в основном используются для вставки символов в пространство имен 'std ::', а не для добавления 'extern 'C" {'. По крайней мере, на моей машине, он отлично работает, чтобы включить все стандартные заголовки C напрямую, вставив символы в глобальное пространство имен. – cmaster

+0

К сожалению, иногда в стандартной библиотеке нет эквивалента C++ (11), например, арифметика с датами (http://stackoverflow.com/a/15669430/1025391) – moooeeeep

20

Я просто приведу параграф из стандарта ISO/IEC N3690 (стандарт C++).

17,2 Стандартная библиотека C

1 C++ Стандартная библиотека также делает доступными объекты стандартной библиотеки C, соответствующим образом отрегулировано для обеспечения статической безопасности типа.

Так просто да!

0

да .Вы можете использовать стандартные функции библиотеки C в C++ Примеры

stdio.h => cstdio (printf/scanf) 
    math.h => cmath  (sqrt) 
Смежные вопросы