LINUX.ORG.RU

★ Неведомый зверёк, а есть ли он в природе? ★

 , , , ,


1

1

Короче у меня от этой кроссплатформенности голова кругом, SDL2 спасает только разве что от совсем базовых, но важных конечно вещей, стандартная библиотека С и то не всегда всё гладко, старание придерживаться POSIX конечно тоже здорово, но ПОЗИКС тоже как бэ не один, а во всех разбираться крыша поедет. Проблема в том что вот ты начинаешь писать новую функцию вот тебе надо создать каталог и перейти в него, нагенерить файлов обойти их попутно обходя рекрсивно другой каталог и потому удалить всё это брахло и тут на каждом шагу остановки, а будет ли это работать тут, а там, а вот тут, и каждый раз не веря гуглу перекомпилять под разное дабы проверить что всё хорошо ибо всегда что-то можно упустить и не заметить. Ну перекрываю поток воды, смысл думаю понятен про что я.

И теперь вопрос, есть ли в природе такой зверёк которому можно скормить исходники проекта и он прочекает совместимость по стандартам, платформам и всё вот это и выдаст например что-то типа

~$croscheck --all-targets -R ~/my_project
~$############### STD CHECK ################
~$[POSIX - ISO/IEC/IEEE 9945:2009] - 100%  совместимости : используйте -v для подробностей
~$[POSIX - ISO/IEC/IEEE 9945:2009/Cor 2:2017] - 2 ошибки совместимости : используйте -v для подробностей
~$[и так далее всякие ISO C 99/11 куча всего]
~$[blablabla] 1% совместимости 65898 ошибок : используйте -v для подробностей
~$############## ARCH CHECK ###############
~$[Little endian] - 3458 ошибок нет гарантии работы !
~$[Big    endian] - OK!
~$[Word        8] - Работа невозможна!
~$[Word       16] - Работа невозможна!
~$[Word       32] - 640 ошибок типа
~$[Word       64] - OK!
~$[и куча другой фигни разноцветной]
~$############# SUMMARY ###################
~$[OK] 100% совместимая платформа -> x86_64 Linux(from 2.6 to 5.2) В рамках POSIX 9945:2009 gcc(from 6.3 to 9.2) 
~$[OK] 100% совместимая платформа -> x86_64 MacOSX(from x.x to x.x) В рамках POSIX 9945:2009 gcc(from 6.3 to 9.2) 
~$[ER] Сломана совместимость с Ms Windows / NDK Android / blablabla : используйте -v для подробностей

Ну и с флагом -v выводились бы отсутствующие функции, константы, макросы, типы там заголовки и так далее Ну и если я например хочу 32bit + 64bit + Android + Linux + Windows, а остальное мне не важно то чекаю типа

croscheck -R target_arch=i686,x86_64 target_platform=Linux,Windows,Android ~/my_project и всё

Вот такую штуку я хочу (✿◠‿◠) есть такая (づ。◕‿‿◕。)づ ?

UDP: И что бы она ещё альтернативу предлагала например

You use TARGET=Linux|gcc mkdir() -> TARGET=Windows you can fix compatibility and use ifdef witch UCRT API _mkdir

Ну или чёт типа того =)

UDP: Поправочка ненужнистам =)

К примеру под винду виндузятник написал оочень полезную утилиту которая конвертирует pdf в текст ооочень быстро и качественно , она под GPLv3 и красота, но только вот автор активно использует WIN API и треды виндузовые и ещё типы какие то странные, ну и как первый шаг просто чекаем что в коде несовместимо с Linux POSIX и просто пошагово вносим изменения пока полностью не портируем программку до 100% совместимости с новой платформой, а потом уже можно смержить код специфичные вещи выделив в ifdef или либы, как кому удобнее, я вот всё выношу в SDL_local.c к примеру

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)

Проверяешь на x86-64 и опционально на arm, остальное не нужно и не встречается.

anonymous
()

К примеру под винду виндузятник

Проверяешь под линуксом и опционально вендавсом. Ну ты понел.

anonymous
()

есть такая (づ。◕‿‿◕。)づ ?

да.

./configure
make

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

eternal_sorrow ★★★★★
()

Шёл XIX век. Замусоривание кода ифдефами всё ещё считается нормальным.

anonymous
()
Ответ на: комментарий от anonymous

Шёл 21 век. Не все операционные системы ещё следуют стандарту POSIX и для совместимости с ними приходится замусоривать код #ifdef’ами.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Не, ну да есть к примеру autoscan который может пройтись по коду и сгенерить чекалку configure и так далее. Но хочется чего-то иного. Что бы типа Линтер но заточенный на API их сравнение и вот всё это =) Ну чисто хотелка. А так да, только пересборка и тесты пока что почти гарантируют корректность на разных платфомах и API

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

ну так очевидно, делать всё это стоит на той платформе, которая тебе и нужна. именно так кроссплатформенный софт и пишется, а как иначе?

eternal_sorrow ★★★★★
()

Возьми и напиши такое, даже в зачаточном виде будет полезно тебе, и, может, ещё кому-то. А то, получается так: «Писать тесты не хочу, читать доки не хочу!11 Есть ли такая кнопка „Сделать Зашибись“?!1»

anonymous
()

То что ты просишь называется man в мире *nix и msdn в мире windows. Никто за тебя всё разжевывать, да ещё и ложить тебе в рот не будет.

anonymous
()
Ответ на: комментарий от anonymous

Возьми и напиши такое, даже в зачаточном виде будет полезно тебе, и, может, ещё кому-то.

Ну так я и интрересуюсь может уже есть такое в природе

А то, получается так: «Писать тесты не хочу, читать доки не хочу!11 Есть ли такая кнопка „Сделать Зашибись“?!1»

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

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Ну так я и интрересуюсь может уже есть такое в природе

То есть гугл тебе не помог, или же ты сразу сюда побежал спрашивать совета у лоровских анонимусов?

anonymous
()
Ответ на: комментарий от anonymous

Нет ты не понял, если следовать этой логике можно в компиляторе отключить все варнинги и самоуверенно строчить код как швея мотористка. Маны манами, читать их хочешь или нет придётся ибо надо же смотреть как работать с той или иной функцией, макросом, типом, константой. Дополнительный чек не отменяет чтения доков, но даёт больше информации которую всю невозможно всегда держать в голове, ну а порой просто знать те или иные ососбенности новой к примеру для тебя платформы. Ну скажет тебе софтина мол вот этой функции для нужной тебе платформы нету, фикси это или вот и всё. Берёшь и фиксишь. Даже не имея нужную платформу под рукой в принципе к примеру, удобно же

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Вы тоже люди =) От того что я спрошу лишний раз мир не рухнет. Нет, значит нет, есть значит есть. Не знаем значит не знаем.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Ну скажет тебе софтина мол вот этой функции для нужной тебе платформы нету, фикси это или вот и всё.

То есть, ты всё-таки хочешь кнопку «Сделай за меня». Только тщательное тестирование на каждой из платформ, на крайний случай в виртуалке/эмуляторе или вайне, по-другому никак. Все нормальные люди так и пишут. А твоим статическим анализом ты, может, и отловишь какие-никакие ошибки, но без тестирования на целевой платформе никуда, если у тебя конечно не какой-нибудь форк чьей-то ХеллоуВорлд лабораторки.

anonymous
()
Ответ на: комментарий от eternal_sorrow

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

Ск, даже с ифдефама всё можно слелать без мусора, вот только кому это нужно — какой-то недалёкий прогер решит, что смержить две читаемые функции в одно убожество норма, и почувствует себя круто. Ведь он сделал полезное дело. А то что в его кале потом час разбираться — «вы просто неосиляторы» и «это так и делается».

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

21 век.

anonymous
()
Ответ на: комментарий от eternal_sorrow

Ссанный посикс вовсе и не должен поддерживаться всеми ос. Это не стандарт, а нонсенс. Нельзя сделать стандарт уровнем повыше? Или все имплементации должны подстраиваться под какое-то кю? Несмотря на то, что все ос умеют одно и то же.

anonymous
()
Ответ на: комментарий от anonymous

Ск, даже с ифдефама всё можно слелать без мусора, вот только кому это нужно — какой-то недалёкий прогер решит, что смержить две читаемые функции в одно убожество норма, и почувствует себя круто. Ведь он сделал полезное дело. А то что в его кале потом час разбираться — «вы просто неосиляторы» и «это так и делается».

Можно короткий пример этих двух подходов, ведь я так полагаю Вы нашли «идеальный способ решения проблем». Да, на дворе уже 3-е сентября, но пусть для меня сегодня будет День Знаний. Научите меня, мой многоуважаемый анонимный коллега.

anonymous
()
Ответ на: комментарий от anonymous

то есть ты предлагаешь пилить две идентичные функции для разных платформ с минимальными платформоспецифичными различиями?

eternal_sorrow ★★★★★
()
Ответ на: комментарий от anonymous

@LINUX-ORG-RU

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

anonymous
()
Ответ на: комментарий от eternal_sorrow

Что и требовалось доказать. У си/сиплюсаторов стремление к замусориванию кода в генах.

Что ж, ч отвечу. Для начала нужно поменять комбинации тинина, аденина, цитозина и гуанина в ДНК. Какой участок, и на какую в итоге, увы я не знаю.

Потом поразмышлять ещё раз. Я просто не вижу смысла что-то объяснять, вариантов не так и много. Но из всех из них, ты выбрал самый дерьмовый. Это стремление к замусореванию хоть как-то оправдано? Ну, кроме перечисленных выше вариантов.

anonymous
()
Ответ на: комментарий от anonymous

Ты детектор чини. Я Си и плюсы учил конечно в универе, но сейчас ничего на них не пишу. Просто высказываю свои мысли по поводу того, почему так устроено.

Лучше ты ответь мне на вопрос: ты троллишь или честно интересуешься вопросом? Если первое, то в отношении меня это бессмысленно. Если второе, то сбавь тон, если хочешь добиться какого то конструктива.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от anonymous

то просто используй готовые кроссплатформенные библиотеки, оттестированные годами

Ну так уже SDL2_xxx + OGL + stdlib =) Конечно можно уйти на lua /love и избежать ооочень многого. Но я уж выбрал С.

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

Йех, да, тут и не поспорить. Но каюсь очень часто я подхожу к тому или иному вопросу играючи неправильно или слабо вникая в детали. Это как бы плохо, но тот факт что я всё это делаю любительски, подстегает меня на всякие нехорошества наверное =) Гы

LINUX-ORG-RU ★★★★★
() автор топика

Ты уже сколько лет программишь на C? И все еще не прочувствовал его суть. Только проверки по типу черных ящиков тебе подойдут. Разворачиваешь узелы CI на нужных платформах и гоняешь сборку и тесты, исправляя свой говнокод. Следование бест практис, которых за полвека существования C накопилось немало адекватных, уменьшает геморрой.

anonymous
()
Ответ на: комментарий от anonymous

Не пихать ифдеф в тело функции.

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

Да, во многих случаях ваш принцип применим, но не всегда. Например, вот код из одного открытого проекта:

static inline unsigned util_last_bit(unsigned u)
{
#if defined(HAVE___BUILTIN_CLZ)
   return u == 0 ? 0 : 32 - __builtin_clz(u);
#elif defined(_MSC_VER) && (_M_IX86 || _M_ARM || _M_AMD64 || _M_IA64)
   unsigned long index;
   if (_BitScanReverse(&index, u))
      return index + 1;
   else
      return 0;
#else
   unsigned r = 0;
   while (u) {
      r++;
      u >>= 1;
   }
   return r;
#endif
}

Как это написать понятнее, используя Ваш Подход?

anonymous
()
Ответ на: комментарий от anonymous

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

Ты что, автор же у нас ИГРУ ПИШЕТ с помощью лора, соответственно тут уж без тестирования на целевой платформе с мышкой/геймпадом в руках никуда.

anonymous
()
Ответ на: комментарий от eternal_sorrow

Да мне интересно стремление к каломётству и копрофилии среди си/сиплюсаторов. Меня это интересует как психиатора. Так тебе есть что сказать? Я в нетерпении. Или ты просто так пытаешься съехать (ну, когда ты ложанул, предложив масштабную копипасту как альтернативу)?

anonymous
()
Ответ на: комментарий от LINUX-ORG-RU

Ну так уже SDL2_xxx + OGL + stdlib =)

Так это не единственные библиотеки, облегчающие программирование на C. Тем более, судя по этой теме тебе их явно не хватает.

Конечно можно уйти на lua /love и избежать ооочень многого. Но я уж выбрал С.

Что плохого в смене инструмента? Особенно в свете того, что для тебя он, очевидно, сложен. Или у тебя запущенный случай болезни «всрусь, но не покорюсь»?

anonymous
()
Ответ на: комментарий от anonymous
int big_shit(void) {
  // platform independent
  big_shit_motherfucker(&val);
  // platform independent
}
#ifdef венда
   #include "app_win.c"
#else
   #include "app_posix.c"
#endif

or

#ifdef венда
  void big_shit_motherfucker(int *val) {
  // platform dependent
  }
#else
   // the same for posix
#endif

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

Конечно со всем этим можно не заморачиваться, если поддержка кода не планируется (<- это реальная причина всего этого ифдеф маскарада).

anonymous
()
Ответ на: комментарий от anonymous

Инлайн и статик, если угодно.

anonymous
()
Ответ на: комментарий от anonymous
#ifdef венда
   #include "app_win.c"
#else
   #include "app_posix.c"
#endif

Я сам использую этот подход в большинстве случаев, но всегда, так как иногда более уместным является другой подход. Так вот, на примере того конкретного фрагмента кода, покажите, как он должен быть переписан, чтобы стать более читабельным, или признайте, что применение #ifdef внутри функции, все же иногда приводит к более понятному коду.

anonymous
()
Ответ на: комментарий от anonymous

#include «app_win.c»

Лорчую подход с отдельными платформоспецифичными сорсами. Часто это каталоги `port/win`, `port/bsd` etc.

Конечно, если такая функция в проекте одна, то не стоит заморачиваться, и сделать надо как проще. Но при первых признаках расширения кода и\или ошибок в этом месте - всё причесать.

anonymous
()
Ответ на: комментарий от anonymous

на примере того конкретного фрагмента кода, покажите

Лично я смотрел бы, сколько таких функция в проекте, без контекста и полной картины - всё это переливание из пустого в порожнее. Если она одна, то пусть так и остается, она неплоха. Единственное, пришлось бы добавить тесты на каждую ветвь. Ведь они там есть, в оригинальном проекте, да?

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

Если она одна, то пусть так и остается, она неплоха.

В этом файле их две — для 32 и 64 битов.

Единственное, пришлось бы добавить тесты на каждую ветвь. Ведь они там есть, в оригинальном проекте, да?

Конкретно для этой функции нет :)

anonymous
()
Ответ на: комментарий от anonymous

Твой пример — выход из реальности в угоду своим хотелкам. Даже если в твоём хелловорде реально только одна функция платформо-различная, то это всё равно не повод марать её нутро ифдефом.

Это не совсем хелловорлд, и уж точно не мой. В этом файле где-то 2-3 компактных платформозависимых функции, которые бы ты с удовольствием превратил в спагетти, используя свой «единственно верный подход». Ведь я пытаюсь донести, что оба подхода применимы в определенных ситуациях, догмы здесь неуместны.

anonymous
()
Ответ на: комментарий от anonymous

Ведь я пытаюсь

Ты пытаешься добиться он него слов: «да, милый». Чувак, это странно! По теме то всё понятно уже и разжевано

anonymous
()
Ответ на: комментарий от anonymous

Ты сэкономил 4 строчки. Я тебе говорю что эта экономия не нужна. Посуди сам, у тебя по ходу кода пересекаются блоки — функция и ифдеф. И всё это ради 4х сьрочек. Если это не совсем хелловорд, не значит, что это совсем не хелдоворд. Меня умиляет как быстро запела твоя душа, стоило тебн снискать поддержки. Мэн, запомни главное свойство жизни — ты убедишься в том, в чём хочешь убедиться. Мнения не имеют значения. Имеют значения доводы, логически обоснованные. Как ты обоснуешь пересечение блоков четырьмя строчками? Тем что это общепринятая практика — эта практика плоха. Она делает код менее читаемым. А любой годный текстовый редактор выделяет похожие слова. Т.е. тебе даже не надо проверять по буквам, что имя функции скопипащено правильно.

anonymous
()
Ответ на: комментарий от anonymous

Ты пытаешься добиться он него слов: «да, милый»

Было бы неплохо, милый.

anonymous
()
Ответ на: комментарий от anonymous

Ты сэкономил 4 строчки. Я тебе говорю что эта экономия не нужна.

Мнения не имеют значения. Имеют значения доводы, логически обоснованные.

Как для любителя логически обоснованных доводов, ты ужасно долго увиливаешь от моего предложения продемонстрировать то, как можно переписать этот код проще и понятнее. Дерзай. Заодно будет повод отправить патч в этот «Хеллоуворлд».

anonymous
()

Есть такая утилита, компилятор называется. Берёшь и собираешь до первого сообщения об ошибке.

А вообще, для тех, кому нужна кроссплатформенность и нативный код одновременно, давно придумали Qt/C++.

hobbit ★★★★★
()

★ Неведомый зверёк, а есть ли он в природе? ★

Надо было так:

✡ Кошерный зверёк, а есть ли он в природе? ✡

anonymous
()
Ответ на: комментарий от anonymous

Это для job было бы актуально ( ͡° ͜ʖ ͡°)

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

Шёл 21 век, а C и подобная лажа, переносимая только в теории, до сих пор замусоривает планету.

По сабжу: я обычно прогоняю через multiarch/crossbuild по всем необходимым архитектурам. И потом вношу коррективы там, где валится.

rebforce
()
Последнее исправление: rebforce (всего исправлений: 1)
Ответ на: комментарий от anonymous

См. выше. Ты либо слепой, либо невменоз. Рискну предположить, что у тебя проблемы с восприятием и анализом от того, что ты тусил с с/++-аторами и они перепутали твоё тело с телом функции и по привычке насовали в него ифдефов.

anonymous
()
Ответ на: комментарий от anonymous

У кошерного не может быть задней части, т.к. там запрещённый Торой седалищный нерв. А от этой темы дурно пахнет — она халяльная максимум.

anonymous
()

Use Python, Luke!

Или просто тестируй под нужными ОС и аппаратными платформами - всё, /thread

А вообще есть кроссплатформенные библиотеки

I-Love-Microsoft ★★★★★
()

Вот из-за этой херни я и перешёл на более высокоуровневые языки. Нет в сях решения для этой проблемы и не будет (как бы я ни любил их).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.