Я думаю, что у меня есть усовершенствованное знание C++, и я хотел бы изучить C.
Существует много ресурсов для помощи людям, идущим от C до C++, но я ничто не нашел полезным, чтобы сделать противоположность этого.
Конкретно:
Здесь уже много всего, так что, возможно, это всего лишь незначительное дополнение, но вот что я считаю самыми большими отличиями.
Библиотека:
Идиомы:
vector
и string
экономят вам много работы), интеллектуальные указатели (вы не можете использовать «интеллектуальные указатели» как таковые в C. может выполнять подсчет ссылок, но вы должны увеличивать и уменьшать количество ссылок самостоятельно, что очень чревато ошибками - причина, по которой интеллектуальные указатели были добавлены в C ++ в первую очередь), и отсутствие RAII в целом который вы заметите везде, если привыкли к современному стилю программирования на C ++.
class
в C ++. Вы должны придерживаться соглашения о добавлении префиксов ко всему, что вы хотите связать с типом. enum
, но во многих более старых кодах вместо этого используется #define
), а также для дженерики (где C ++ использует шаблоны). Совет:
Активно используйте прямое объявление, чтобы сделать типы непрозрачными. Если в C ++ у вас могут быть личные данные в заголовке и полагаться на private
предотвращает доступ, в C вы хотите как можно больше помещать детали реализации в исходные файлы. (На самом деле, на мой взгляд, вы тоже хотите сделать это в C ++, но C упрощает это, поэтому это делают больше людей.)
C ++ показывает реализацию в заголовке, хотя технически он скрывает ее от доступа за пределами класса.
// Чхх
класс C
{
общественность:
void method1 ();
int method2 ();
частный:
int value1;
char * value2;
};
C помещает определение «класса» в исходный файл. Заголовок - это все предварительные объявления.
// Ch
typedef struct CC; // предварительное объявление
void c_method1 (C *);
интервал c_method2 (C *);
// Копия
структура C
{
int value1;
char * value2;
};
Glib является хорошей отправной точкой для современного C и позволяет вам привыкнуть к таким понятиям, как непрозрачные типы и полуобъектная ориентация, которые стилистически распространены в современном C. На другом конце спектра стандартные API POSIX являются добрыми. из «классического» C.
Самый большой пробел в переходе от C ++ к C не в синтаксисе, а в идиоме, и там, как и в C ++, существуют разные школы программирования. Вы напишете совершенно другой C, если будете использовать драйвер устройства, а не, скажем, синтаксический анализатор XML.
Рассмотрим ваши вопросы по порядку:
Некоторые из них могут показаться довольно краткими, но такова жизнь. Есть несколько хороших библиотек для C, но нет ни одного места, подобного Boost, где бы они были собраны вместе или получили относительно единообразный интерфейс, как Boost для C ++.
Есть много идиом, но многие из них связаны с тем, как вы редактируете свой код, например, имитируя RAII, быстро записывая fopen ()
и соответствующий fclose ()
, и только потом писать промежуточный код для обработки данных.
Ловушки / ловушки, которые ждут за каждым углом, в основном проистекают из отсутствия динамических структур данных, таких как строка и вектор, поэтому вам часто приходится писать такие вещи самостоятельно. Без перегрузки операторов, конструкторов и т. Д. Значительно сложнее сделать их действительно универсальными. Они есть во многих библиотеках, но в конечном итоге вы все равно катаетесь самостоятельно, потому что:
Разница в установка почти наверняка самая важная вещь, по крайней мере, для меня. Когда я пишу на C ++, я концентрирую почти все свои реальные усилия на разработке максимально чистых интерфейсов, и я склонен рассматривать реализацию интерфейса как почти одноразовый код. По большей части я не планирую вносить незначительные изменения в эту часть кода - пока интерфейс хорош, замена всей реализации обычно достаточно проста, и я не особо беспокоюсь об этом.
В C кажется (по крайней мере, мне) намного сложнее отделить интерфейс от реализации почти так же тщательно или чисто. Таким образом, я склонен тратить намного больше времени, пытаясь реализовать каждую часть кода как можно более чисто, потому что более поздние изменения имеют тенденцию быть более сложными, а выбрасывание и замена частей, которые не очень хороши, значительно реже работают. очень хорошо.
Edit (поскольку люди поднимают вопросы о поддержке C99): Хотя мое заявление об отсутствии поддержки C99 может показаться резким, факт в том, что это правда.
MS VC ++: поддерживает C95 и имеет несколько функций C99 (например, разделители комментариев в стиле C ++), в основном потому, что C99 стандартизировал то, что раньше было расширением.
Gnu: Согласно на странице C99 Features Status самая последняя итерация gcc (4.4) имеет некоторые функции C99, но некоторые (включая VLA) характеризуются как «сломанные», а другие как «отсутствующие». Некоторые из недостающих «функций» на самом деле являются целыми областями , а не отдельными функциями.
PCC: Сайт PCC заявляет о соответствии C99 только как цели на будущее, а не как
Embarcadero Technologies (урожденная Borland), похоже, вообще ничего не говорит о соответствии с C99 - судя по всему, последний раз они работали над компилятором C, возможно, еще до того, как был выпущен C99.
Microsoft открыто заявляет , что у них нет текущих планов поддержки C99, и они даже не собираются рассматривать это до выхода VS 2010. Хотя я не могу найти никаких публичных заявлений об этом, Embarcadero выглядит примерно так же: нет намека на текущий план и даже на то, что они собираются рассмотреть возможность работы над ним в ближайшее время.
Хотя кажется, что оба gcc и pcc иметь планы, в настоящее время это просто планы. Они оба открыто признают, что в настоящее время они даже не очень близки к тому, чтобы соответствовать C99.
re не собираюсь даже рассматривать это, пока не выйдет VS 2010. Хотя я не могу найти никаких публичных заявлений об этом, Embarcadero выглядит примерно так же: нет намека на текущий план и даже на то, что они собираются рассмотреть возможность работы над ним в ближайшее время.Хотя кажется, что оба gcc и pcc иметь планы, в настоящее время это просто планы. Они оба открыто признают, что в настоящее время они даже не очень близки к тому, чтобы соответствовать C99.
re не собираюсь даже рассматривать это, пока не выйдет VS 2010. Хотя я не могу найти никаких публичных заявлений об этом, Embarcadero выглядит примерно так же: нет намека на текущий план и даже на то, что они собираются рассмотреть возможность работы над ним в ближайшее время.Хотя кажется, что оба gcc и pcc иметь планы, в настоящее время это просто планы. Они оба открыто признают, что в настоящее время они даже не очень близки к тому, чтобы соответствовать C99.
Вот краткий справочник о некоторых важных вещах, которые вам нужно знать.
Это совет, о котором вы не просили: я думаю, что большинство потенциальных работодателей считают само собой разумеющимся, что если вы знакомы с C ++, вы знаете C. Изучение тонкостей C в то время как интересное академическое упражнение , ИМО не принесет вам много квалификационных баллов.
Если вы когда-нибудь окажетесь в положении, когда вам нужно будет сделать C, вы уловите различия достаточно быстро.
Но не слушайте меня. . Я был слишком ленив и глуп, чтобы изучать C ++ :)
Что-нибудь еще полезно знать?
C99 - это не подмножество любой версии C ++, а отдельный язык.
За исключением очень немногих случаев, любой код C является действительным C ++, поэтому на самом деле нет ничего нового, что вам следует изучать.
Это скорее вопрос отучения.
Не использовать новые, не использовать классы, определять переменные в начале блока кода и т. Д.
В строгом смысле C ++ не является объектно-ориентированным, но он по-прежнему процедурный с поддержкой классов. Тем не менее, вы фактически уже используете процедурное программирование на C ++, самым шокирующим изменением будет отсутствие классов, наследования, полиморфизма и т. Д.
Поскольку C ++ является почти надмножеством C89, вы уже должны знать почти весь C89. Вероятно, вы захотите сосредоточиться на различиях между C89 и C99.
Q5. Что-нибудь еще полезное?
Купите копию K & R2 и прочтите ее. С точки зрения стоимости страницы, это, вероятно, будет самая дорогая книга по вычислениям, которую вы когда-либо купите на собственные деньги, но она даст вам глубокую признательность за C и мыслительные процессы, которые были в нем вложены. Выполнение упражнений также отточит ваши навыки и поможет вам привыкнуть к тому, что доступно в этом языке в отличие от C ++.
Пожалуй, самым большим шоком, который я испытал, когда я вернулся к C, было то, что переменные определены на уровне функций - т.е. вы не можете переменные области видимости внутри блока (оператор if
или цикл
) внутри функции.