Ответ 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).
-
Узнайте, что делает preprocessor и что вы не должны делать с ним, даже если можете.
-
Изучите все возможности endian-ness, выравнивание слов, арифметика указателей и другие архитектурные арканы низкого уровня. Вопреки распространенному мнению, это не ракетостроение. Если вы чувствуете увлеченность, попробуйте освоить язык ассемблера и получить от этого хорошее знание. Он многое сделает для вашего понимания того, что происходит в вашей программе на C.
-
C не имеет понятия области видимости модуля, поэтому планируйте свое использование включений, деклараций прототипов и использования
extern
иstatic
, чтобы сделать частные области видимости и идентификаторы импорта. -
Попытка (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.