Прямо сейчас я знакомлюсь с C и стандартной библиотекой C, и мне интересно, будут ли полезны мои знания в этой области, когда я перейду к работе с C ++ позже.
Поэтому я хотел бы знать, могу ли я использовать функции, предоставляемые стандартной библиотекой C, в настройках C ++, а также, имеет ли и почему смысл это делать.
Да, C ++ изначально разрабатывался так, чтобы любая библиотека C могла легко использоваться в C ++. Конечно, это немного менее верно (в частности, если библиотека C использует ключевое слово C ++, например, try
или же dynamic_cast
это не сработает; также, если Перезвоните закодированный в 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
-подобные процедуры обычно более локализация дружелюбный с Gettext (3).
тем не мение C и C ++ очень разные языки. Вы должны кодировать на идиоматическом C ++ 11 (используя стандартный C ++ контейнеры, auto
, укупорочные, RAII, умные указатели, правило пяти, SFINAE, исключения, анонимные функции, …)
Некоторые стандартные функции C не очень полезны в идиоматическом C ++. Например, вы вряд ли будете использовать непосредственно malloc
в подлинный C ++ (хотя бы предпочитаю new
— который все еще находится на очень низком уровне и не более в духе C ++, более вероятно, что он будет использовать контейнеры и умные указатели без работа с распределением кучи вручную). Но POSIX функции (особенно Системные вызовы (2) ….) весьма полезны в C ++. longjmp
вероятно, будет несовместимо с исключениями C ++.
Кстати, C ++ развился много в этом веке. Не учите C ++ 98, но по крайней мере C ++ 11 (имеются огромный различия между ними) и, возможно, C ++ 14. Использовать недавний компилятор (НКУ или же Clang / LLVM); в декабре 2015 года это означает GCC 5 по крайней мере или Clang / LLVM 3.7 по крайней мере. Не забудьте включить все предупреждения & отладочная информация в компиляторе (например, g++ -Wall -Wextra -g -std=c++11
)
C ++ (это означает C ++ 11 как минимум) это сложно язык программирования, значительно сложнее, чем C. Вам понадобятся недели чтения, чтобы изучить некоторые из них, и хороший стиль кодирования и дисциплина очень важны (вы можете легко написать очень дрянной код на C ++). Начать с Программирование: принципы & Практика использования C ++
Я считаю, что если вы знаете только C, читая SICP (и изучая немного Схемы) до изучение C ++ имеет смысл.
Понятие неопределенное поведение это очень важно, как в C, так и, возможно, даже больше в C ++. Вам абсолютно необходимо это понять (см. блог об этом) а также избежать Это.
Вы также многому научитесь, изучая (и, возможно, внося свой вклад) в некоторые существующие бесплатно программное обеспечение и его исходный код. Поэтому я рекомендую использовать Linux.
Я просто процитирую параграф из стандарта ISO / IEC N3690 (стандарт c ++).
17.2 Стандартная библиотека C
1 Стандартная библиотека C ++ также предоставляет средства стандартной библиотеки C, соответствующим образом отрегулированные для обеспечения безопасности статических типов.
Так просто да!
да. Вы можете использовать стандартные функции библиотеки C в C ++
Примеры
stdio.h => cstdio (printf/scanf)
math.h => cmath (sqrt)