ПредишенСледващото

При работа с микроконтролери на ниско ниво е много често е необходимо да се работи с отделни битове в регистрите на конфигурация, различни държави на флага, и т.н. Традиционно, на езика на "C" се използват за тази битови цели числа и операции с тях. Всичко изглежда, че просто и ясно, какво друго е необходимо? Въведете безопасност. Цяло число променлива се използва за знамената, можете да зададете произволен брой съвсем неочакван и компилаторът няма да бъде напълно против него.

Нека да преминем към практиката. Символичните имена за флага удобен обявени използване ENUM-а:

Типични променлива число флаг:

Дотук всичко изглежда чисто и хубаво, но нищо не ни пречи да се напише така:

Какъв вид знамена са били освободени, са инсталирани? Компилаторът все още се хранят и да не се задуши, myFlags - число променлива и може да съхранява всичко. Но понякога, изглежда толкова просто, вместо дълъг низ от вида: flag0 | flag1 |. | flagM напише едно кратко малко число, което изглежда толкова очевидно ... Сега - ясно утре за себе си, тъй като той вече не е всичко, за да бъде средната, но за други, а дори и повече.
Би било желателно да се ограда от тези "допълнителен капацитет" да работи с флаговете е по-тежка. Очевидно е, че в този случай, се съхраняват знамената не се нуждаят в цяло число променлива, но променлива от тип ENUM-а - MyFlags.

Първият ред работи, както се очаква, не можете да зададете променлива знамена така или иначе-то - само изброените елементи. Но тук ние сме в очакване на още един проблем, изразът flag0 | flag1 (като други побитови операции с изброяване) е от тип Int и втора линия ще доведе до грешка компилатор. Ние ще трябва да използвате един глас, но го направи ясно при всяка операция с флаговете не е по-добре, отколкото в магазина знамена Int:

Можете да ги скриете тип реализация в специалните функции (не в макроса, или целия контрол на видовете гори ще отидат):

Напиши тези функции до известна разумен брой аргументи и да се използват:

Тя изглежда да има не е лошо - неговата цел, безопасност тип, които вече сме постигнали. C ++, което можете да направите още по-добре - просто смаже нашия флаг ENUM и битови дейности:

Привеждане на аргумента за пад в този случай е необходимо, че няма безкрайна рекурсия :) Сега използвайте знамената това е много по-лесно:

За удобство при използването на претоварени оператори zapihnom за ENUM-ите в макрос:

Сега, за използването на типа безопасно флаг е достатъчно да напишете следните трансфери и определени битови операции за него:

Тези флагове, например, удобно да използват, за да се инициализира на различните периферни устройства. Пример инициализира USART модул STM32:

Какво ще кажете за ситуацията, в която вие създавате фондацията, архитектурата на проекта, както и пълното му изпълнение и да го придружи на други хора? Колкото по-малко ще бъде възможно да се притеснявам, толкова по-голям шанс, че проектът ще бъде завършен и последователен. Може би изпитвате малки команда работи :)

да, има по-голямата част от него е не особено голям

Ololo, не съм прав за работа в екип?) Както за полагане на архитектура, която изпълнява други, често индианците, аз също мислех.

Изрично тип в този случай ще бъде веднага личи и, за разлика от постоянното tselotsislennoy лесно намери чрез търсене с помощта на регулярни изрази.
Ако можете да си себе си и другите по-малко opezopasit от такива неща, и той е свободен, защо не го правят?

Е, простота включително насърчава четливост и възможности за поддръжка. Освен ако, разбира се, с изключение на един прост 0x2F вместо flag1 | flag2 | flagN.
Но моето разбиране е красива - това е просто технически елегантен и четлив.

Не по-малко ефективни програми и ви позволява да пишете доброто старо В. И ако не можете да видите разликата ... не по-малко ефективни програми ви позволяват да въведете добрия стар код двоичен машина. Е, какво да кажем за благото карам. Но C ++ в способните ръце на един и същ от C различава.

О, гледа към "простота" Аз искам да плача. (
Blah, дори малко в регистъра не може да се установи, без да navertev километър черупки около елементарен оператор | =.
Също приложат безсмислени ограничения - това не е C-пътя. Също така не трябва да juzat 0x2F вместо flag1 | flag2 | flagN нужда мозъците znachntelno по-малко от vkuril за всички тези шибан джунгла код C ++.
Като цяло, Аз съм с вас poputi. /

Е, на нивото на програмата изрично е възможно и бюст (ако работите самостоятелно - в противен случай подобни трикове могат да следват, за да принуди нормално да пишат останалите). И тук на ниво библиотека вече е доста смислено.
Пример, между другото, ако се съди по външния си вид, като се има просто защото UART библиотека.

Няколко пъти по челото shmyaknut Клаудия и ще пиша правилно. )
И още веднъж претоварване стандартни оператори не трябва да ненужно. Не е необходимо да направим нещата по-сложни и объркващи, просто защото можете.

Де да беше толкова просто, Вирт не са работили върху всички нови езици, които не позволяват да се застреля в крака :)

Ако разбирам английския текст в него, според профсъюзите сутринта, той не казва нищо ново.
И така е ясно, че влизането на плувка в съюза не може да се чете като едно цяло число с надеждата за получаване на цялата част от. Дори ако обединението се състои от поплавък и вътр.

PS. ако използвате анонимен структура, флаговете за запис стане по-лесно


За Misr аз не знам нищо, освен, че е.

Не. Писане поплавък в съюза, не можем да очакваме, че от едно цяло число, което четете reinterpret_cast (поплавък). И ако ти пиша flag.f = 0 - няма гаранция, че това ще зададе битови флагове. Да, обикновено става това, но според стандарта е UB.

Писане поплавък в съюза, не можем да очакваме, че от едно цяло число, което четете reinterpret_cast (поплавък).
Не е ясно какво може да се наложи един глас. Има отделен достъп до INT и поотделно, за да поплавъка.
Или сте, че е невъзможно да се определи точно какво се съхранява вътре в съюза по всяко време - вътр или поплавък? Уау.
lag.f = 0 - няма гаранция, че това ще зададе битови флагове. Да, обикновено става това, но според стандарта е UB. С UB битови полета са не по-малък проблем носи.

Подкрепете проекта - споделете линка, благодаря!