Всем привет, ну начну с того что некоторое время назад решил писать своё поделие, ну вроде сервис в основе которого kore.io и в процессе появились потребности, система тестирования, HTML шаблонизатор, обработка utf-8 под мои потребности ну и то-ли NIH синдром то-ли спортивный интерес (не так важно) пишется всё самостоятельно (не без вашей помощи, за что спасибо), но в процессе так же задумался над переносимостью и... ребят я даже немного потерялся.
Порядок байт. Ну начнём с того что например для обработки utf-8 по всем фронтам побитовые сдвиги и чтение отдельных битов, ну вроде ладно чё, в чём проблема, а проблема например в том что порядок байт разный и что мне определять сначала что у меня sparc64 или i386 а потом уже с учётом этого читать байты с конца или с начала?
Атомарность. Ну хорошо 32bit умирает, но мне пофигу если я пишу библиотеку то я хочу что бы она работала везде, ладно у меня может не быть uint64_t и знание того что где то long 64bit, а где то 32bit и я могу смело (да?) писать unsigned long long и быть уверенным что в 64 битной системе это 64 а в 32 битной это тоже 64 но эмулируется через два 32битных инта и вот тут как бы уже нет гарантий что операции записи переменной или чтения отработают.
Вернусь к типам. Мне нравиться что у меня богатый выбор типов на все случаи жизни и конструкции для создания своих типов, а также смешанные типы (union). ладно я могу «впереди планеты всей» и иметь целевую платформу x86_64, а на остальных... ну ломается логика и х** с ними, но что будет когда придёт x86_128, не ржите я серьёзно если я использую (вынужден) в случае utf-8 использовать битовые операции каков вариант что снова придётся что-то менять. Ах да, касаемо тонны zise_t ptrdiff_t u/int8/16/32/64_t fast хераст и прочих что являются typedef от фундаментальных char/short/int/long/long long/ + signed/unsigned, я правильно понимаю что нет никакой разницы пишу ли я uint64_t или unsigned long long int ?
libc Эмм, с89/с99/с11 где то напрямую отказываются от поддержки стандарта msvc не хочет с99 реализовывать в полной мере, тоесть уже нет гарантий, ладно на дворе почти 2018 надо с11, но и тут glibc не имеет <threads.h> а musl имеет, как при этом всём гарантированно быть уверенным что у меня есть гарантия реализации стандарта. Как жить :D И да в случае если на какой либо системе нет <stdint.h> и я намеренно пишу unsigned long long int подразумевая (на данный момент) uint64_t это нормально?
Ну больше писать не буду хотя есть что, я не профессиональный программист да и просто программистом себя назвать не могу в полной мере, мне нравится «С» и вроде как получается писать что-то что работает на моей машине.Но прихожу к выводу что я не знаю как на нём писать нормальный и переносимый код.
Дайте советы если есть желание или почитать что что-бы просвятиться. У меня есть желание писать железный код, но чем больше я закапываюсь во всём этом тем меньше понимания как собственно его писать железно.
Выдыхаю ::) Ну и по традиции cast сишников i-rinat, beastie, ncrmnt, Iron_Bug, peregrine, xpahos, anonymous_incognito, ncrmnt, DELIRIUM.