Программы
Сделаем свою небольшую библиотеку на Си

Сделаем свою небольшую библиотеку на Си

Делаем свою первую переиспользуемую библиотеку на Си

Вспомним связный список, который мы реализовали в теме про динамическую память.

Для начала определим "правила игры" / "контракт" нашей библиотеки в заголовочном файле linked_list.h

#ifndef	_LINKED_LIST_H_
#define	_LINKED_LIST_H_

#include <stdio.h>

typedef struct node {
  struct node * next;
  char val;
} node_t;

void print_list(node_t *head);
void add(node_t * head, char val);

#endif /* _LINKED_LIST_H_ */

Ну и сам код, "реализация контракта" linked_list.c:

#include "linked_list.h"
#include <stdlib.h>

void print_list(node_t *head) {
  node_t * current = head;

  while (current != NULL) {
    printf("%c->", current->val);
    current = current->next;
  }

  printf("\n");
}

void add(node_t * head, char val) {
  node_t * current = head;
  while (current->next != NULL) {
    current = current->next;
  }

  current->next = (node_t * )malloc(sizeof(node_t));
  current->next->val = val;
  current->next->next = NULL;
}

И main.c, который будет использовать нашу библиотеку:

#include "linked_list.h"

int main() {
  char c;
  node_t head = { .next = NULL, .val = ' ' };

  while ((c = getc(stdin)) != EOF) {
    add(&head, c);
  }

  print_list(&head);
}

Начинаем собирать. Сначала объекты нашей библиотеки и основного файла:

→ clang -c linked_list.c -o linked_list.o
→ clang -c main.c -o main.o

В сущности, именно сейчас и происходит "компиляция". Компилятор берет файлы с исходным кодом и получает из них объектные файлы.

Далее, собираем их в программу:

→ clang linked_list.o main.o -o linked_list_example

Линковщик берет объектные файлы и получает из них исполняемый файл. Сборка = компиляция + линковка.

Задание на подумать/проверить

Что будет, если мы в linked_list.c:

  1. Не будем подключать linked_list.h, а определим node_t и подключим stdio.h.
  2. Добавим в конец структуры Си-файла ещё одно поле, а в .h-файле не изменим структуру.
  3. Добавим в начало структуры Си-файла ещё одно поле, а в .h-файле не изменим структуру.

ДЗ

Написать библиотеку для реализации аналога утилиты xxd для структур Си.

Также может быть вам интересно:

Заголовочные файлы в Си

Начинаем писать свои "библиотеки" в Си

Читать »

Автоматизация работы с помощью make

Во время сборки приходится делать много рутинных операций. Давайте автоматизировать!

Читать »
Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

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

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

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

Фото Шаблон разработки ПО — Model View Controller (MVC)

Шаблон разработки ПО — Model View Controller (MVC)

MVC - один из самых распространённых архитектурных шаблонов разработки. Часто используется в различных фреймворках. В том числе и в Django.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!

Фото Пользователи и их создание в Django - своя регистрация на сайте

Пользователи и их создание в Django - своя регистрация на сайте

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