# 06 лекция - C, подробно
> [TOC]
## Про подключаемые файлы
Иногда при перестановке подключения хидеров (заголовочных файлов - `#include "a.h"`) программа не компилируется. Это сигнализирует о том, что один из хидеров **не подключил** все необходимые **ему** хидеры!
-Почему же компилировалось раньше?
-Потому что этот самый заголовочный файл подключался в `.cpp` файлы уже после необходимого ему хидера, тем самым невербально получая его. А как мы помним `.h` файлы отдельно не компилируются, только внутри `.cpp` при его подключении!
Для избегания данной проблемы необходимо подключать все нужные заголовочные файлы внутри `.h` заголовочного файла нашей библиотеки.
## Тип size_t
Тип, который нужно использовать для размера чего-либо в памяти. Это стандартный тип стандартной библиотеки (не языка!), то есть если ничего стандартного не заинклюдить (подключить заголовочный файл) его не будет. Его подлючают почти все стандартные хидеры тк многие стандартные функцию принимаю в качестве аргумента или возвращают значение типа `size_t`.
При компиляции в 32бита это будет 32битный тип, при 64 - 64битный. Беззнаковый, потому что размер обьекта не может быть отрицательный.
Если нужен такой же тип, но знаковый, самое близкое стандартное - `ptrdiff_t`, тип, который хранит разницу между указателями.
Для использования `size_t` с семейством функций `scanf/printf` есть модификатор `%zu`, однако он был добавлен только с C99, для более старый версий есть специальные макросы (дефайны). (для `ptrdiff_t` есть `%ti` или `%td`)
(Данный тип описан в заголовочном файле `stddef.h` для языка `C` и в файле `cstddef` для языка `C++`)
### Цикл по size_t
**В обратном направлении:**
```c
size_t x=3;
printf("zu\n", x);
for(; x--; )
{
printf("%zu ", x);
}
printf("\n%zu", x);
```
```
> 3
> 2 1 0
> MAX_VAL
```
Цикл от [N-1, ... , 0] - не очень простая конструкция.
**Для беззнаковых чисел гарантируется модулярная арифметика**, то есть можно вычитать из unsigned 0 и получить работающую программу. Для знаковых чисел в этом месте [Undefined Behavior](https://en.cppreference.com/w/cpp/language/ub).
---
Тип `long` плох для хранения размера тк на windows он всегда 32битный, а на linux зависит от разрядности, также как и `size_t`.
## Модификаторы типа
# Оглавление
9% - C/C++, 6 лекция, 19.03.2022, Скаков
> [TOC]