Ответ 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.