Глава 29: Быстрая справка (Cheat Sheets) ======================================== В этом разделе вы найдёте компактные справочные материалы по часто используемым функциям, конструкциям и концепциям языка C, а также по ключевым компонентам библиотеки GTK. Эти "шпаргалки" призваны стать быстрым источником информации во время разработки, помогая освежить в памяти синтаксис и назначение различных элементов. Cheat Sheet: Основы языка C --------------------------- .. list-table:: :header-rows: 1 :widths: 15 25 60 * - Концепция - Ключевые слова/Пример - Описание * - **Объявление переменных** - `int x = 10;` - Объявление переменной определённого типа и опциональная инициализация. * - **Типы данных** - `int`, `float`, `double`, `char`, `void` - Основные встроенные типы данных для целых чисел, чисел с плавающей точкой, символов и универсального указателя. * - **Указатели** - `int *ptr;`, `&x`, `*ptr` - Переменные, хранящие адреса памяти. `&` - оператор взятия адреса, `*` - оператор разыменования. * - **Массивы** - `int arr[10];`, `arr[0]` - Фиксированные коллекции элементов одного типа, доступ по индексу. * - **Строки** - `char str[] = "Hello";`, `char *s = "World";` - Массивы символов, заканчивающиеся нулевым символом (`\0`). * - **Структуры** - `struct Point { int x, y; };` - Пользовательский тип данных, объединяющий переменные различных типов под одним именем. * - **Условные операторы** - `if`, `else if`, `else`, `switch` - Управление потоком выполнения в зависимости от условий. * - **Циклы** - `for`, `while`, `do-while` - Повторное выполнение блока кода. * - **Функции** - `return_type func_name(params) { ... }` - Блоки кода, выполняющие определённую задачу; могут принимать аргументы и возвращать значение. * - **Ввод/Вывод (базовый)** - `printf()`, `scanf()`, `getchar()`, `putchar()` - Функции для взаимодействия с консолью. * - **Комментарии** - `// однострочный`, `/* многострочный */` - Пояснительный текст в коде, игнорируемый компилятором. * - **Подключение библиотек** - `#include ` - Включение содержимого заголовочных файлов. Cheat Sheet: Основные функции C (Standard Library) -------------------------------------------------- .. list-table:: :header-rows: 1 :widths: 20 20 60 * - Функция - Заголовок - Описание * - `printf(format, ...)` - `` - Выводит форматированный текст на стандартный вывод (консоль). * - `scanf(format, ...)` - `` - Читает форматированный ввод со стандартного ввода (консоли). * - `fprintf(file, format, ...)` - `` - Выводит форматированный текст в указанный файл. * - `fscanf(file, format, ...)` - `` - Читает форматированный ввод из указанного файла. * - `fopen(filename, mode)` - `` - Открывает файл; возвращает указатель на `FILE`. * - `fclose(file)` - `` - Закрывает открытый файл. * - `fread(ptr, size, count, file)` - `` - Читает `count` элементов размером `size` из `file` в `ptr`. * - `fwrite(ptr, size, count, file)` - `` - Записывает `count` элементов размером `size` из `ptr` в `file`. * - `malloc(size)` - `` - Выделяет блок памяти размером `size` байт; возвращает `void*`. * - `calloc(count, size)` - `` - Выделяет `count` элементов размером `size` байт и инициализирует их нулями. * - `realloc(ptr, new_size)` - `` - Изменяет размер ранее выделенного блока памяти. * - `free(ptr)` - `` - Освобождает блок памяти, ранее выделенный `malloc`, `calloc` или `realloc`. * - `strlen(s)` - `` - Возвращает длину строки `s` (без учёта завершающего `\0`). * - `strcpy(dest, src)` - `` - Копирует строку `src` в `dest`. * - `strncpy(dest, src, n)` - `` - Копирует не более `n` символов из `src` в `dest`. * - `strcat(dest, src)` - `` - Конкатенирует (объединяет) `src` к `dest`. * - `strcmp(s1, s2)` - `` - Сравнивает строки `s1` и `s2`; возвращает 0, если равны. * - `atoi(s)` - `` - Преобразует строку в целое число. * - `atof(s)` - `` - Преобразует строку в число с плавающей точкой. * - `rand()` - `` - Генерирует псевдослучайное число. * - `srand(seed)` - `` - Инициализирует генератор псевдослучайных чисел. * - `time(NULL)` - `` - Возвращает текущее календарное время. Cheat Sheet: Макросы и Препроцессор C ------------------------------------- .. list-table:: :header-rows: 1 :widths: 20 20 60 * - Макрос/Директива - Пример/Использование - Назначение * - `#define` (константа) - `#define PI 3.14159` - Объявляет символическую константу, которая заменяется значением во время препроцессинга. * - `#define` (функция-макрос) - `#define SQUARE(x) ((x)*(x))` - Определяет макрос, который ведёт себя как функция, но выполняется путём текстовой подстановки. Важно использовать скобки для избежания ошибок с приоритетом операций. * - `#include` - `#include `, `#include "myheader.h"` - Включает содержимое указанного файла в текущий файл. Используется для подключения заголовочных файлов стандартных библиотек (`<...>`) или пользовательских файлов (`"..."`). * - `#ifdef`, `#ifndef`, `#endif` - `#ifdef DEBUG ... #endif` - Директивы условной компиляции: код компилируется, если макрос определён (`ifdef`) или не определён (`ifndef`). * - `#if`, `#elif`, `#else` - `#if VERSION >= 3 ... #endif` - Условная компиляция на основе арифметического выражения. * - `#undef` - `#undef PI` - Отменяет предыдущее определение макроса. * - `#error` - `#error "Ошибка компиляции"` - Вызывает ошибку компиляции с указанным сообщением. * - `#pragma` - `#pragma once` - Предоставляет компилятору специфичные инструкции (зависит от компилятора). `once` - для предотвращения многократного включения заголовка. * - `__FILE__` - `printf("Файл: %s\n", __FILE__);` - Предопределенный макрос, расширяется до имени текущего исходного файла. * - `__LINE__` - `printf("Строка: %d\n", __LINE__);` - Предопределенный макрос, расширяется до номера текущей строки в исходном файле. * - `__DATE__` - `printf("Дата: %s\n", __DATE__);` - Предопределенный макрос, расширяется до строки с текущей датой компиляции. * - `__TIME__` - `printf("Время: %s\n", __TIME__);` - Предопределенный макрос, расширяется до строки с текущим временем компиляции. .. _cheat_gtk_widgets: Cheat Sheet: Основные виджеты GTK (GObject Hierarchy) ----------------------------------------------------- .. list-table:: :header-rows: 1 :widths: 15 20 65 * - Виджет (Класс) - Заголовок - Назначение и Ключевые методы * - `GtkWindow` - `` - **Основное окно приложения.** Контейнер верхнего уровня. * `gtk_window_new(GTK_WINDOW_TOPLEVEL)`: Создаёт новое окно. * `gtk_window_set_title(window, "Title")`: Устанавливает заголовок. * `gtk_window_set_default_size(window, width, height)`: Устанавливает размеры по умолчанию. * - `GtkButton` - `` - **Кнопка для пользовательских действий.** * `gtk_button_new_with_label("Text")`: Создаёт кнопку с текстом. * `g_signal_connect(button, "clicked", G_CALLBACK(handler), data)`: Подключает обработчик нажатия. * - `GtkEntry` - `` - **Однострочное поле ввода текста.** * `gtk_entry_new()`: Создаёт новое поле ввода. * `gtk_entry_get_text(entry)`: Получает текущий текст. * `gtk_entry_set_text(entry, "Text")`: Устанавливает текст. * `gtk_entry_set_placeholder_text(entry, "Hint")`: Устанавливает текст-заполнитель. * - `GtkLabel` - `` - **Виджет для отображения неизменяемого текста.** * `gtk_label_new("Text")`: Создаёт метку с текстом. * `gtk_label_set_text(label, "New Text")`: Изменяет текст метки. * `gtk_label_set_wrap(label, TRUE)`: Включает перенос текста по словам. * - `GtkBox` - `` - **Контейнер для упорядоченного расположения виджетов** (горизонтально или вертикально). * `gtk_box_new(GTK_ORIENTATION_VERTICAL, spacing)`: Создаёт вертикальный/горизонтальный контейнер с отступами. * `gtk_box_pack_start(box, child, expand, fill, padding)`: Добавляет дочерний виджет в начало. * - `GtkGrid` - `` - **Контейнер для расположения виджетов в табличной форме** (строки и столбцы). * `gtk_grid_new()`: Создаёт новую сетку. * `gtk_grid_attach(grid, child, left, top, width, height)`: Прикрепляет виджет к ячейке. * - `GtkImage` - `` - **Виджет для отображения изображений.** * `gtk_image_new_from_file("path/to/image.png")`: Создаёт изображение из файла. * - `GtkScrolledWindow` - `` - **Контейнер для виджетов, которые могут быть прокручены**, если их содержимое превышает размеры. * `gtk_scrolled_window_new(NULL, NULL)`: Создаёт новое прокручиваемое окно. * `gtk_container_add(scrolled_window, child)`: Добавляет прокручиваемый виджет. * - `GtkTextView` - `` - **Многострочное поле для редактирования и отображения текста.** Использует `GtkTextBuffer` для хранения текста. * `gtk_text_view_new()`: Создаёт новый `GtkTextView`. * `gtk_text_view_get_buffer(text_view)`: Получает буфер текста. * - `GtkAboutDialog` - `` - **Диалоговое окно для отображения информации о приложении** (автор, версия, лицензия). * `gtk_about_dialog_new()`: Создаёт диалог. * `gtk_about_dialog_set_program_name(dialog, "Name")`: Устанавливает имя программы. * - `GtkDialog` - `` - **Базовый класс для всех диалоговых окон.** * `gtk_dialog_new_with_buttons(...)`: Создаёт диалог с кнопками. * `gtk_dialog_run(dialog)`: Запускает диалог модально, возвращает ответ. * - `GtkSpinner` - `` - **Индикатор выполнения неопределённой операции** (вращающийся кружок). * `gtk_spinner_new()`: Создаёт спиннер. * `gtk_spinner_start(spinner)` / `gtk_spinner_stop(spinner)`: Запускает/останавливает анимацию. --- **Общие методы для всех `GtkWidget`:** .. list-table:: :header-rows: 1 :widths: 20 80 * - Метод - Описание * - `gtk_widget_show_all(widget)` - Показывает виджет и всех его дочерних элементов. * - `gtk_widget_hide(widget)` - Скрывает виджет. * - `gtk_widget_destroy(widget)` - Уничтожает виджет, освобождая связанные ресурсы. * - `gtk_widget_set_name(widget, name)` - Устанавливает CSS-имя (ID) для виджета, используемое для стилизации (`#name`). **Ключевой для CSS-стилизации!** * - `gtk_widget_add_css_class(widget, class_name)` - Добавляет CSS-класс для виджета, используемый для стилизации (`.class_name`). * - `gtk_widget_remove_css_class(widget, class_name)` - Удаляет CSS-класс. * - `gtk_container_add(container, child)` - Добавляет дочерний виджет в контейнер (если контейнер может иметь только одного потомка, как `GtkWindow`). * - `g_signal_connect(instance, "signal_name", G_CALLBACK(handler_func), user_data)` - Подключает функцию-обработчик к сигналу виджета. * - `g_object_unref(object)` - Уменьшает счётчик ссылок объекта GObject. Когда счётчик достигает 0, объект освобождается. **Важно для управления памятью!** --- Рекомендуемые онлайн-ресурсы и инструменты ------------------------------------------ Для углублённого изучения языка C, препроцессора и разработки интерфейсов с помощью GTK, рекомендованы следующие онлайн-источники: **Язык C и стандартная библиотека:** * `cppreference.com (раздел C) `_ — Современный, исчерпывающий справочник по языку C и его стандартной библиотеке. * `cplusplus.com/reference/clibrary `_ — Классический справочник по стандартной библиотеке C (обновляется редко, но может быть полезен). * `godbolt.org (Compiler Explorer) `_ — Онлайн-инструмент для просмотра ассемблера, генерируемого различными компиляторами C/C++. Позволяет экспериментировать с кодом и видеть результат сразу. * `repl.it (REPL for C) `_ — Онлайн-компилятор C. Удобен для быстрого тестирования небольших фрагментов кода без установки локального компилятора. **Препроцессор и макросы:** * `GCC Preprocessor Documentation `_ — Официальное руководство по препроцессору GCC. Полный список директив, поведение макросов, условной компиляции и пр. * `wandbox.org `_ — Онлайн-песочница с поддержкой множества компиляторов (включая GCC, Clang) и возможностью использовать различные стандарты языка (C89–C23). **GTK и Glade:** * `GTK 3 Reference Manual `_ — Полная и актуальная документация по библиотеке GTK 3. Включает описание всех доступных виджетов, сигналов и методов. * `GTK 4 Reference Manual `_ — Документация по последней версии GTK. Некоторые подходы и API могут отличаться от GTK 3. * `Glade User Documentation `_ — Описание возможностей интерфейсного конструктора Glade и примеры использования. * `GNOME Developer Center `_ — Централизованный ресурс по разработке приложений под GNOME, включая GTK, GObject, GLib и другие технологии. * `libadwaita & libhandy (для GTK 4) `_ — Дополнительные библиотеки, применяемые в современных интерфейсах GNOME. **GitHub и код:** * `Поиск по GitHub: GTK projects `_ — Репозитории с открытым исходным кодом, использующие GTK. Можно изучать примеры интерфейсов, стилизацию и работу сигналов. * `awesome-c `_ — Подборка лучших библиотек, инструментов и ресурсов по языку C. --- * **Изучайте документацию:** Эти справки лишь базовые, для глубокого понимания обращайтесь к официальной документации GTK и стандартам C.