Подтвердить что ты не робот

Ресурсы для обучения программе C

Исходя из фона OO (С#/java) Я ищу ресурсы, чтобы научиться хорошо разрабатывать чистые программы.

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

EDIT: Я рад полностью отказаться от OO для программирования на C, я заинтересован в том, как структурировать программу без OO, я хочу узнать о хороших способах разработки программ на процедурных языках, таких как C.

4b9b3361

Ответ 1

В этой публикации есть список книг unix, который включает в себя большинство классических работ C/Unix. Для программирования C в Windows Petzold Программирование Windows, вероятно, лучший старт.

Для разработки программы C некоторые из книг по программированию unix расскажут вам фрагменты, но я не знаю о книге "C program architecture".

Если вы привыкли к java, некоторые советы для программирования на C:

  • Сделать использовать stack. Часто, когда вы вызываете процедуру, вы хотите иметь переменные, выделенные в кадре стека вызывающего, и передать им указатели в процедуру, которую вы хотите вызвать. Это будет значительно быстрее, чем динамическое распределение памяти с помощью malloc() и гораздо меньше подверженности ошибкам. Делайте это, когда это необходимо.

  • C не делает сбор мусора, так что динамическое распределение элементов данных более сложно, и вы должны отслеживать их убедитесь, что они освобождены. Переменные, выделенные в стеке (см. 1), более "идиоматичны", где они применимы. Кроме того, вам не нужно их освобождать - это бонус для локальных переменных.

  • По поводу (2) рассмотрим архитектуру, в которой ваши функции возвращают код состояния или ошибки и передают данные в стек и выходят с использованием стека согласно (1).

  • Узнайте, что setjmp() и longjmp(). Они могут быть весьма полезны для общих механизмов обработчика ошибок вместо функциональных возможностей обработки структурированных исключений.

  • C не поддерживает исключения. См. (3).

  • Lint - ваш друг. Splint еще более дружелюбен.

  • Узнайте, что делает preprocessor и что вы не должны делать с ним, даже если можете.

  • Изучите все возможности endian-ness, выравнивание слов, арифметика указателей и другие архитектурные арканы низкого уровня. Вопреки распространенному мнению, это не ракетостроение. Если вы чувствуете увлеченность, попробуйте освоить язык ассемблера и получить от этого хорошее знание. Он многое сделает для вашего понимания того, что происходит в вашей программе на C.

  • C не имеет понятия области видимости модуля, поэтому планируйте свое использование включений, деклараций прототипов и использования extern и static, чтобы сделать частные области видимости и идентификаторы импорта.

  • Программирование GUI в C утомительно на все платформ.

  • Попытка (10) изучить C API по крайней мере одного языка сценариев, например Tcl, Lua или Python. Во многих случаях наилучшее использование C является основным высокопроизводительным движком приложения, которое в значительной степени написано в чем-то еще.

  • Эквивалент конструктора - это инициализирующая функция, в которой вы передаете указатель на элемент, который хотите настроить. Часто вы можете видеть это в виде вызова функции, которая выглядит как setup_foo(&my_foo). Лучше выделить выделение из инициализации, так как вы можете использовать эту функцию для инициализации элемента, который вы выделили в стеке. Аналогичный принцип применяется к деструкторам.

  • Большинство людей находят венгерскую нотацию о том, что она читается как написанная венгеркой. Исключением из этого являются родные венгерские ораторы, которые обычно находят венгерскую нотацию примерно так же отчетливо, как Cuneiform.. К сожалению, венгерская нотация широко встречается в программном обеспечении Windows, и весь API Win32 использует ее, ожидая влияния на читаемость программного обеспечения, написанного на этой платформе.

  • Книги C/Unix, даже действительно хорошие, например, те, что написаны покойным Ричардом Стивенсом, как правило, доступны довольно дешево на рынке Amazon. В произвольном порядке не получите копию K & R, Stevens APUE и UNP 1 & 2, Дракон, Rochkind, Программирование Pearls, Petzold и Richter (если работает в Windows) и любой другой классический C/Unix. Прочитайте, нарисуйте на них карандашом и вообще взаимодействуйте с книгами.

  • В Интернете есть много, много хороших ресурсов C/Unix в Интернете.

  • Прочитайте и поймите Десять заповедей программирования на C и некоторые из мета-дискуссий о том, почему и почему за этими заповедями, Это покажет свой возраст в определенной степени, хотя большая его часть по-прежнему актуальна, и неясные компиляторы по-прежнему довольно распространены в мире встроенных систем.

  • Lex и Yacc являются вашим другом, если вы хотите писать парсеры.

  • Как указывает Navicore ниже (+1), Hanson 'C Интерфейсы и "Реализации" - это безупречный дизайн интерфейса/реализации для модульной архитектуры с кучей примеров. Я действительно слышал об этой книге и слышал об этом, хотя я не могу утверждать, что прочитал ее. Помимо C-идиом, которые я описал выше, эта концепция, возможно, является ядром хорошего процедурного дизайна. Фактически, другие процедурные языки, такие как Modula-2, действительно делают эту концепцию явной в их дизайне. Это может быть ближе всего к книге "Архитектура программной программы" в печати. ​​

  • Прочитайте C FAQ.

Ответ 2

Мои проблемы с OO обратно на C были рассмотрены в Дэвиде Хэнсоне "C-интерфейсы и реализации".

C Интерфейсы и реализации

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

Ответ 3

Вот несколько интересных ответов из другого вопроса, касающегося программирования OO в C. Я сделал сообщение о некотором C-коде, с которым я работал, с которым в основном ускоренная объектная ориентация останавливается только коротко не включая виртуальные методы.

Если бы я делал C-кодирование, я бы использовал эту технику для определения "объектов".

Я считаю, что сохранение Design Patterns в виду всегда полезно и может быть реализовано на большинстве языков.

Вот хороший PDF, обсуждающий объектно-ориентированное программирование на языке C..

Ответ 4

minix by tanenbaum

Ответ 5

Более крупные приложения? Сила - это когда вам приходится иметь дело с вещами низкого уровня, такими как драйверы устройств, планировщики и другие приправленные ОС.

Вы можете сделать C, который работает как OO, но это будет предельно ощущаться как упражнение при повторном создании колеса.

Ответ 6

Одна из незначительных вещей - заказать ваши .c файлы "назад" - т.е. поместить main() в конец файла и всегда следить за тем, чтобы локальные функции (те, которые не находятся в вашем .h файле, что вы просто написано для использования в этом файле) живут выше, где они впервые используются. Это означает, что вам не нужно писать для них прототипы, что еще не так важно, если вы должны изменить свой API.

Затем, в качестве бонуса, команда "gD" в vim всегда будет идти к определению функции, если она находится в том же файле:)

Ответ 7

В то время как он написан как несколько языковой-агностический текст, Code Complete дает много хороших рекомендаций по структуре кода и организации, со строительными практиками.