All streams
Search
Write a publication
Pull to refresh
78
0
Send message

Мне, разумеется, кажется, что я вполне понимаю :) Если вам не трудно, поясните, в чем именно я не прав?


В пункте 6.2.1 Scopes of identifiers читаем "An identifier can denote an object; a function; a tag or a member of a structure, union, or enumeration; a typedef name; a label name; a macro name; or a macro parameter."


Т.е. идентификатор — это в т.ч. имя переменной. У вас __config — это имя переменной.


Весь пункт 7.1.3 описывает зарезервированные идентификаторы; идентификаторы, которые начинаются с двух подчеркиваний — зарезервированы всегда (это я уже цитировал), т.е. в любых областях видимости.
Использование зарезервированных идентификаторов в контекстах, в которых они зарезервированы — UB. Т.е. использовать два подчеркивания в начале идентификаторов нельзя вообще, в любых контекстах.


Зачем читать всю главу 7 (которая описывает стандартную библиотеку), я не очень понимаю, это вроде к делу не относится.


Я честное слово не понимаю, в чем я не прав, объясните, пожалуйста!

Каким образом это приводит к неопределенному поведению, что-то вы ахинею говорите. Несколько раз перечитал спойлер, так и не понял о чем вы.

Это цитата из стандарта С99. "Все идентификаторы, которые начинаются с подчеркивания и заглавной буквы или двух подчеркиваний являются зарезервированными" — т.е. их нельзя объявлять, они зарезервированы для использования компилятором или стандартной библиотекой.


Там же, далее "If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined." — т.е. использование таких идентификаторов приводит к неопределенному поведению (пардон, сразу не процитировал этот кусок).

EEMEM tConfig __config;

Не по теме, но замечу, что идентификаторы, которые начинаются с двух подчеркиваний, зарезервированы и не должны использоваться в пользовательском коде, это UB.


Spoiler header

C99 7.1.3 Reserved identifiers: "All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use."

std::loop_helper::for i std::loop_helper::in days

Воо, вот это я понимаю, богоугодная фигня!

Так непонятно, с чего счет начинается :)

Может тогда уж сразу for i in 0..days без всякой iota?

АО ПКК "Миландр" wants to know your location :)


Еще можно поискать отладочные платы с нужным контроллером, или делать микроплаты-переходники, чтобы запаивать несовместимые по пинам чипы (скажем, F4 даже на чип-дипе еще есть по цене всего в 1к за штуку).


Но вообще можно только посочувствовать...

Сделать список из чисел от 1 до 189 и итерироваться по нему b раз, начиная с позиции а :)
(типа сложение по аксиомам Пеано)

В качестве альтернативы отмечу, что у Альтиума с некоторых пор есть какая-никакая интеграция с git'ом — например, диффы таки можно посмотреть:


Spoiler header

image


Но насколько я понимаю, мерджи делать будет почти невозможно, поэтому на мой взгляд вместо гита лучше подойдет (о боги!) SVN, поскольку в нем можно делать глобальный лок на редактирование.

Так это норма. Деление на ноль — это неопределенное поведение, оно не обязано порождать какие-то ошибки.
В embedded достаточно часто получается просто ноль и все :)

Да, ассерты в SPL и HAL — достаточно полезная штука; хотя примерно половину можно было бы убрать, если вместо uint16_t параметры у функций были бы enum class (я понимаю, что они не могут, но помечтать-то можно).


А вот у LL ассертов на порядок меньше, это немного напрягает.

В последний раз я давненько проверял, конечно. Надо будет перепроверить, но чет я сомневаюсь.

А, вы про кейл. Просто я сразу вспомнил про:
gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
github.com/google/sanitizers/wiki/AddressSanitizer

А разве эти опции работают для таргета arm-none-eabi?

Выявление багов при помощи надежного тестирования, очистки и фаззинга критически важно для повышения качества и корректности любых программ, в том числе, написанных на Rust.

Забавно, что fuzzing остался фаззингом, а вот address sanitizer превратился в "очистку".

Людей можно понять, в плюсах и функции «сами собой вызываются». Причем ведь накалываешься на мелочах — упустил буквально один символ при наборе, и если бы у тебя не был удален конструктор копирования, то ты бы не увидел ошибку, и возможно нескоро узнал бы, что делаешь что-то не то.

Да я их прекрасно понимаю, че уж. С по крайней мере можно целиком в голове удержать, а С++ уже кажется нельзя :)


Хм, а я ни разу. А что с санитайзерами кстати, почему нет?

Почему — не знаю, просто нету их и все.
Ну, точнее, у Кейла они в альфе сейчас https://www.keil.com/support/man/docs/armclang_ref/armclang_ref_lnk1549304794624.htm, про другие тулчейны не в курсе

А вы про какую ситуацию? Просто какой-нибудь парсер со сложным автоматом на кучу потоков не заменишь. Или вы про другое?

Парсер не особо, но просто какую-то логику "событийную" типа "послать такой запрос — подождать ответ (или таймаут) — послать следующий — подождать" — иногда очень хочется.


Да, и оно ведь во многом растет от библиотеки шаблонов. Так что тут так — и этим своим не станешь, и эти врагами объявятся)))

На мой взгляд, оно растет чаще просто от незнания; многие думают, что в С++ память как-то "сама по себе тратится" и не пытаются вникать дальше, просто сходу отметают.


Требования совместимости. Впрочем, выход за границы массива — вещь нечастая. А при наличии foreach… Который еще и оптимизируется лучше.

Имхо норм указатель и размер, я даже в шарпе этого не стесняюсь при работе со строками (иначе получается нечитаемая хтонь), просто дело же не только в этом, спан типа вообще лучше.

foreach по указателю как раз не сделать, например.
Я лично регулярно за границы вылезал, прям фобия развилась. Особенно учитывая, что никаких санитайзеров-то нема, можно ведь вылезти и не заметить вообще.


Вы Аду не пробовали? Тут параллельно идет обсуждение. Там все есть, и все красиво. :)

Слышать — слышал, пробовать — не пробовал. В бывшем СНГ вроде на ней вакансий около нуля, так что… В Rust лично у меня веры больше.

Ммм, вы находите? Вроде норм… Но вообще, как по мне — уж лучше в потоки, я к асинхронщине в принципе отношусь с сомнением.

Можно и потоки, лишь бы не городить полотнища свитчей для конечных автоматов. С другой стороны, зато все просто и понятно :)


Да, но не использовать контейнеры — это же почти идиоматическое преступление, могут и к высшей мере приговорить в интернетах!!!111

В embedded — скорее наоборот, насколько я могу судить; многие придерживаются мнения, что С++ в принципе — это недопустимо.


Впрочем это может быть интересной концепцией — запретить вообще пространство имен STL. Только сишные либы (выпилив и из них динамику) и сам стандарт языка. То есть все эти вот извращения вокруг STL это примерно как мамкино веганство («курицы глупые, их можно есть»), а вот такой подход — чистое, настоящее веганство.

Но в std есть куча полезных вещей, которые с контейнерами не связаны — скажем, std:nth_element или std::atomic; контейнеры в отдельный неймспейс не выделили.


Можно, конечно, просто несколько контейнерных хедеров "запретить", но зачем — если запретить динамическую аллокацию, то с ними все равно линковаться не будет.


А, ну вы про РТТИ еще вспомнили, точно. Главное же кучу задать нулевой!

Просто именно куча опцией-то как раз не выключается, по крайней мере в Кейле для этого прагму надо писать, в gcc или ставить нулевой размер кучи или какой-то костыль делать типа --wrap=malloc. Мб в IAR опция, не знаю.


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

Меня лично спан (как и все остальные контейнеры STL) огорчает в основном тем, что он не проверяет выход за границы в операторе [] — а легко везде заменить [] на at — не особо получается.


Но спан все равно лучше, чем отдельно указатель и размер.

Information

Rating
4,821-st
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity