Могут ли функции из стандартной библиотеки C использоваться в С++?

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

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

Ответ 1

Да, С++ изначально был спроектирован таким образом, что любую C-библиотеку можно легко использовать в С++. Конечно, это немного менее верно (в частности, если в библиотеке C используется некоторое ключевое слово С++, например try или dynamic_cast, это не сработает, также, если callback, закодированный в С++, переданный в библиотеку C, вызывает какое-то исключение, у вас, вероятно, будет большой беспорядок).

Стандартная практика использования файла заголовка C в С++ -

 extern "C" {
 #include <some_c_header_file.h>
 };

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

 #ifdef __cplusplus
 extern "C" {
 #endif

 //// most of the header material goes here, C style

 #ifdef __cplusplus
 }; // end extern "C"
 #endif

На практике многие стандартные заголовки C имеют эквивалентные заголовки С++, которые обертывают такие вещи, как указано выше (а также в namespace std). Например, C <stdio.h> - это С++ <cstdio>, но вам часто следует предпочитать подлинные потоки С++ (<iostream>), однако printf -образные процедуры обычно более localization дружественный, смешанный с gettext (3).

Однако C и С++ - очень разные языки. Вы должны кодировать в идиоматическом С++ 11 (используя стандартный С++ container, auto, закрытия, RAII, интеллектуальные указатели, правило из пяти, SFINAE, исключения, анонимные функции,...)

Некоторые стандартные функции C не очень полезны в идиоматическом С++. Например, вы вряд ли будете использовать непосредственно malloc в подлинном С++ (по крайней мере, предпочитаете new), который все еще очень низкий уровень и не больше в духе С++, скорее всего, много используют контейнеры и интеллектуальные указатели без работая вручную с распределением кучи). Но POSIX функции (особенно syscalls (2)....) весьма полезны в С++. longjmp скорее всего несовместим с исключениями С++.

Кстати, С++ в этом веке многое изменился. Не изучайте С++ 98, но, по крайней мере, С++ 11 (между ними есть огромные различия) и, возможно, С++ 14. Используйте недавний компилятор (GCC или Clang/LLVM); в декабре 2015 года это означает GCC 5 по крайней мере или Clang/LLVM 3,7. Не забудьте включить все предупреждения и информацию об отладке в компиляторе (например, g++ -Wall -Wextra -g -std=c++11)

С++ (это означает, что С++ 11 по крайней мере) - сложный язык программирования, значительно более сложный, чем C. Для изучения некоторых из них вам понадобятся недели чтения, а также хороший стиль и дисциплина кодирования (вы можете легко написать очень дерьмовый код на С++). Начните с Программирование: принципы и практика с использованием С++

Я считаю, что если вы знаете только C, читаете SICP (и изучаете немного схемы), прежде чем учиться С++.

Понятие undefined поведение очень важно, как в C, так и, возможно, даже больше в С++. Вам абсолютно необходимо это понять (см. C.Lattner блог на нем) и избегать это.

Вы также узнаете большой интерес, изучив (и, возможно, способствуя) какое-то существующее бесплатное программное обеспечение и его исходный код. Поэтому я рекомендую использовать Linux.

Ответ 2

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

17.2 Стандартная библиотека C

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

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

Ответ 3

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

    stdio.h   => cstdio   (printf/scanf)
    math.h    => cmath     (sqrt)