Это точно лучше, если M_PI будет по стандарту в этом заголовочном файле.
Дело то в том, что никто не гарантирует, что на вашей платформе с вашим компилятором эта константа есть.
Может быть, нужно хитрый дефайн определить, может быть вообще нету ее там.
Так что давать такие советы как V624 нужно очень осторожно.
Amazon Lumberyard разрабатывается как кроссплатформенный движок. Поэтому разработчики стараются поддерживать как можно больше компиляторов.
Я надеюсь, было понятно, что это не С или С++ компилятор, так что странно читать о кроссплатформенности. Тут речь идет о компилятореGLSL для шейдеров, код которых и формирует та самая функция.
Программа, которая например умеет работать с ATI и NVidia драйверами одновременно, вовсе не обязательно является кроссплатформенной.
Чтобы вызвать libssh2_init конечно же.
Лично я бы сделал управление ресурсами более явно, с RAII.
Иначе моменты захвата и освобождения ресурсов могут быть в разных скоупах.
Так оно того стоило? Далеко не все горят желанием и возможностью обновлять тулчейн по желанию. Может, стоило макросом закрыть для «бедных»?
Что кстати с клангом для сборки драйверов, не знаете? Там по моему с SEH у них нестыковки по прежнему.
Да, на больших объемах могут вылезти ошибки или недостатки проектирования, но при чем тут надежность? Небалансирующееся дерево может выродится в список, но работать то оно не перестанет, просто будет тормозом.
Если у Вас там вероятны проезды по памяти, то напишите приличные тесты и гоняйте их под {l,m}san.
Тег перевода куда-то подевался.
В комментариях к статьям (https://learnopengl.com/#!Model-Loading/Mesh наример), уже указали автору на кучу неточностей и ошибок.
Странное желание обучать других с использованием инструментов, которых не знаешь.
Строка вместо enum для типа текстуры меня покорила.
Простите, что значит — формулировка специально задумана?
Точно так же, как со значением N без указания поведения по умолчанию.
Это тест на умение додумывать за автора, или на написание программ на C++?
Почему не сформулировать задание максимально полно и корректно?
В итоге, это «что-то простое» превратится в большой кусок кода, который делает много вещей.
Иначе он будет мало полезен остальным.
Тогда встанет вопрос — пользоваться Вашим кодом, или протестированной либой с историей, тестами и поддержкой разных платформ, от крупного сообщества.
В любом случае, Вам — удачи, но я бы задумался над тем, чтобы попробовать заслать в апстрим то, что было нужно вместо велосипедостроения.
GTest, например, не так уж плоха.
Тут просто статистика по тесту типа прошел/не прошел и все?
По моему, этого обычно мало.
Зачастую тест содержит не один ассерт, а несколько. Как понять, кто из них сработал?
Как понять, какие значения ожидались, а какие там были на самом деле?
Как вывести дополнительную информацию о контексте ассерта?
Вы имеете ввиду простоту маршалинга данных между другим языком и С?
Конечно, Python или JS не знают о std::string, никто не спорит.
Тут никто не отрицает низкоуровневые плюсы языка С.
Однако, выставить интерфейс для биндинга можно и на С++ (никто не мешает в публичном API принимать const char*).
Например, в ICU примерно так и сделано: внешний API по сути на С, а внутри он оперирует С++ объектами.
В случае С++ вы можете быть поставлены перед выбором: использовать std::vector или писать свой код на malloc + realloc.
Если не хочется использовать Boost\STL — так не используйте, никто же не заставляет.
В случае С вы даже выбора не имеете, ни шаблонов ни деструкторов (RAII), ни move семантики.
Так что разработчик вынужден тратить кучу времени на колупание с указателями, удалением и прочей рутиной.
Основной принцип С++: Вы не платите за то, что не используете.
В том то и вопрос, что сообщество не будет переписывать по сути весь проект, профитов недостаточно, а багов можно таких наделать, что огого.
При этом одиночные энтузиасты будут потом мучительно мержить свой форк с мастером.
Так что без поддержки это просто не выгорит и в лучшем случае просто не будет получать обновления из основного репозитория.
Довольно неожиданно, но интересно.
Для этого нужна определенная смелость.
Вы не подскажете, это некая официальная инициатива, или просто пет-проджект энтузиаста без какой либо поддержки сообщества?
Грустно, конечно, видеть что очень много усилий разработчиков в таких проектах тратятся на то, что в С++ компилятор сделал бы сам.
Например, большую часть кода из патча можно было бы заменить на std::vector<> и пару шаблонных функций. При этом получили бы type safety.
Но понятно, что никто никогда не станет переписывать такие проекты на другом языке.
То, что код компилируется, ничего не значит.
Массивы нулевой длины разрешены в C99, но не в С++(любого стандарта).
И в GCC и в Clang это реализовано через расширение языка, например -Wzero-length-array у Clang.
См. код http://coliru.stacked-crooked.com/a/810283a668408e8a
Использовать это понятно как, например принять по сети пакет с данными переменной длины, но с фиксированным заголовком и указанной длиной буфера.
Не буду ничего говорить про код, не писал на шарпе уже несколько лет.
Но мне не совсем понятна задача утилиты.
У Вас бывает так, что работаете над кодом, затем переключаетесь без коммита и потом забываете, в какой стадии находится работа?
Попробуйте делать небольшие коммиты почаще.
Иначе, вот через неделю я вижу что репозиторий "грязный". Но как понять, нужно ли коммитить, или продолжить разработку? Что должно быть в commit message, если я толком не помню, что делал?
Разве не придется все равно делать git status или запускать утилиту, чтобы понять все это?
Опять же, Ваша утилита даже имя текущей ветки не показывает.
Но мне кажется, если начнете углубляться, то окажется, что копируете GUI вроде того же Tortoise.
Они, конечно же, есть.
Например, Chromium: там warning == error в коде самого Хромиума, для third_party могут быть исключения.
А кода там не 10К, а гораздо больше.
Дело то в том, что никто не гарантирует, что на вашей платформе с вашим компилятором эта константа есть.
Может быть, нужно хитрый дефайн определить, может быть вообще нету ее там.
Так что давать такие советы как V624 нужно очень осторожно.
Вот только в стандарте С и С++ нет такой константы.
stackoverflow.com/questions/1727881/how-to-use-the-pi-constant-in-c
Есть много нестандартных расширений в разных компиляторах, но я бы не стал рекомендовать это вот так, без кучи оговорок.
Я надеюсь, было понятно, что это не С или С++ компилятор, так что странно читать о кроссплатформенности. Тут речь идет о компилятореGLSL для шейдеров, код которых и формирует та самая функция.
Программа, которая например умеет работать с ATI и NVidia драйверами одновременно, вовсе не обязательно является кроссплатформенной.
libssh2_init
конечно же.Лично я бы сделал управление ресурсами более явно, с RAII.
Иначе моменты захвата и освобождения ресурсов могут быть в разных скоупах.
Что кстати с клангом для сборки драйверов, не знаете? Там по моему с SEH у них нестыковки по прежнему.
С первого взгляда, там и С++11 могло бы хватить, но я пару файлов всего глянул.
Если у Вас там вероятны проезды по памяти, то напишите приличные тесты и гоняйте их под {l,m}san.
В комментариях к статьям (https://learnopengl.com/#!Model-Loading/Mesh наример), уже указали автору на кучу неточностей и ошибок.
Странное желание обучать других с использованием инструментов, которых не знаешь.
Строка вместо enum для типа текстуры меня покорила.
Точно так же, как со значением N без указания поведения по умолчанию.
Это тест на умение додумывать за автора, или на написание программ на C++?
Почему не сформулировать задание максимально полно и корректно?
Иначе он будет мало полезен остальным.
Тогда встанет вопрос — пользоваться Вашим кодом, или протестированной либой с историей, тестами и поддержкой разных платформ, от крупного сообщества.
В любом случае, Вам — удачи, но я бы задумался над тем, чтобы попробовать заслать в апстрим то, что было нужно вместо велосипедостроения.
GTest, например, не так уж плоха.
По моему, этого обычно мало.
Зачастую тест содержит не один ассерт, а несколько. Как понять, кто из них сработал?
Как понять, какие значения ожидались, а какие там были на самом деле?
Как вывести дополнительную информацию о контексте ассерта?
Вы имеете ввиду простоту маршалинга данных между другим языком и С?
Конечно, Python или JS не знают о
std::string
, никто не спорит.Тут никто не отрицает низкоуровневые плюсы языка С.
Однако, выставить интерфейс для биндинга можно и на С++ (никто не мешает в публичном API принимать
const char*
).Например, в ICU примерно так и сделано: внешний API по сути на С, а внутри он оперирует С++ объектами.
В случае С++ вы можете быть поставлены перед выбором: использовать std::vector или писать свой код на malloc + realloc.
Если не хочется использовать Boost\STL — так не используйте, никто же не заставляет.
В случае С вы даже выбора не имеете, ни шаблонов ни деструкторов (RAII), ни move семантики.
Так что разработчик вынужден тратить кучу времени на колупание с указателями, удалением и прочей рутиной.
Основной принцип С++: Вы не платите за то, что не используете.
В том то и вопрос, что сообщество не будет переписывать по сути весь проект, профитов недостаточно, а багов можно таких наделать, что огого.
При этом одиночные энтузиасты будут потом мучительно мержить свой форк с мастером.
Так что без поддержки это просто не выгорит и в лучшем случае просто не будет получать обновления из основного репозитория.
Довольно неожиданно, но интересно.
Для этого нужна определенная смелость.
Вы не подскажете, это некая официальная инициатива, или просто пет-проджект энтузиаста без какой либо поддержки сообщества?
Грустно, конечно, видеть что очень много усилий разработчиков в таких проектах тратятся на то, что в С++ компилятор сделал бы сам.
Например, большую часть кода из патча можно было бы заменить на
std::vector<>
и пару шаблонных функций. При этом получили бы type safety.Но понятно, что никто никогда не станет переписывать такие проекты на другом языке.
То, что код компилируется, ничего не значит.
Массивы нулевой длины разрешены в C99, но не в С++(любого стандарта).
И в GCC и в Clang это реализовано через расширение языка, например -Wzero-length-array у Clang.
См. код http://coliru.stacked-crooked.com/a/810283a668408e8a
Использовать это понятно как, например принять по сети пакет с данными переменной длины, но с фиксированным заголовком и указанной длиной буфера.
Не буду ничего говорить про код, не писал на шарпе уже несколько лет.
Но мне не совсем понятна задача утилиты.
У Вас бывает так, что работаете над кодом, затем переключаетесь без коммита и потом забываете, в какой стадии находится работа?
Попробуйте делать небольшие коммиты почаще.
Иначе, вот через неделю я вижу что репозиторий "грязный". Но как понять, нужно ли коммитить, или продолжить разработку? Что должно быть в commit message, если я толком не помню, что делал?
Разве не придется все равно делать
git status
или запускать утилиту, чтобы понять все это?Опять же, Ваша утилита даже имя текущей ветки не показывает.
Но мне кажется, если начнете углубляться, то окажется, что копируете GUI вроде того же Tortoise.
Например, Chromium: там warning == error в коде самого Хромиума, для third_party могут быть исключения.
А кода там не 10К, а гораздо больше.