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

направя. а и ако. друго. за да се уверите, че и запетая винаги означаваше, след като си макро е същото. Да речем, че сте имали нещо като втори макроса.

Сега, ако се наложи да използвате бара (X); ако експресия. друго. където тялото на отчета, ако не са били увити в големи скоби, ще получите лоша изненада.

който е синтактично неправилен, защото иначе вече не е свързан с IF. Не помага да приключи парчетата в скоби в рамките на макроса, защото точката и запетаята след скобите са синтактично неправилен.

Има два начина за решаване на този проблем. Първо, използването на запетая на последователност отчети в макро, не го защитава способността да действа като израз.

Горната версия на бар БАР разширява кода по-горе към следващия, който е синтактично правилни.

Не е нужно да използвате направя. а. бихте могли да се готви нещо, ако. друго. но ако, ако. обемен вътре ако. иначе това ще доведе до "виси" ", което може да усложни допълнително откриване на проблема с друг проблем, както е в следния код.

Въпросът е да се използва точка и запетая в контекст, в който погрешно запетая е погрешна. Разбира се, в този момент вие може (и вероятно би трябвало) твърдят, че това би било по-добре да обяви БАР като действителната функция, а не макро.

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

Има три добри "съвети", за да успеем в това:

Помощ макро се държат като истински код

Нормално код обикновено завършва с точка и запетая. Ако потребителят разглежда кода, който не се нуждае от такава.

Това означава, че потребителят очаква компилаторът ще генерира грешка, ако и запетая липсва.

Ето защо, ние трябва да има макро нуждаещи полу.

Направете валиден код

Както е показано на jfm3 отговор, понякога макроса съдържа повече от едно изявление. И ако макросът се използва вътрешно от оператора, ако тя ще бъде проблематично:

Този макрос може да се използва като:

функция ж се извършва независимо от стойността bIsOk.

Това означава, че ние трябва да добавите областта на макроикономиката:

Направете валиден код 2

Ако макросът е, нещо като:

Възможно е да имаме друг проблем в следния код:

Както ще бъде разширен, както следва:

Разбира се, този код няма да се компилира. Така че, отново, решението да се използва обхват:

Код държи правилно отново.

Комбинирането на ефекти с плъзгач и Zoom?

Има един език C / C ++, която произвежда този ефект: цикъла направи / а:

правя /, докато операцията може да създаде обхват, като по този начин капсулиране на макроси и в крайна сметка се нуждае polutole в края, като по този начин се увеличава код изисква това.

C ++ компилатор оптимизира Do / линия, докато поради факта на нейния след състояние е погрешно, е известно, по време на компилация. Това означава, че макро като:

ще разшири правилно, тъй като

и след това се изготвя и оптимизиран като

@ Jfm3 - Вие имате добър отговор на въпроса. Можете също така да добавя, че макро идиом също така предотвратява възможността за по-опасно (защото няма грешка) неволно поведение с прости операции «ако»:

който е синтактично правилни, така че няма грешки компилатора, но има вероятно непредвидена последица от факта, че г () винаги ще се нарича.

Посочените по-горе отговори обясняват смисъла на тези структури, но няма съществена разлика между тях. В действителност, има основание да се предпочитат направя. а като IF. останало конструкция.

Проблемът на строителството на ако. друго е, че той ви принуждава да се сложи точка и запетая. Тъй като в този код:

Въпреки, че ние оставаме с точка и запетая (по погрешка), кодът ще разшири дейността си в

и той автоматично ще се компилира (макар че някои компилатори могат да отправят предупреждение за недостижим код). Но изявление ФОРМАТ никога няма да бъде изпълнена.

направя. докато структурата няма такъв проблем, защото единствен валиден логика след време (0) е точка и запетая.

Макар да се очаква, че ефектът от оптимизиране на компилатори направя, докато (фалшиво); Loop, има друго решение, че няма да изисква този дизайн. Решението е да използвате точка на оператора:

или дори по-екзотично:

Въпреки, че тя ще работи добре с индивидуални инструкции, че няма да работи със случаи, когато са създадени и се използват като част от #define променливите.

С това, че е възможно да се използват правя /, докато структура.

Препроцесор библиотека Йенс Gustedt (! Да, фактът, че такова нещо съществува, също взривиха съзнанието ми), за да се подобри дизайна ако (1) още малко, но значимо начин, за да се определи следното:

Основната причина за това е, че, за разлика от направя, докато (0). прекъсне и да продължи да продължи да работи в рамките на даден блок, но ((свободен) 0) създава синтактична грешка, ако точка и запетая пропуснат след макро повикване, които в противен случай биха пропуснали следващия блок. (Всъщност, няма проблеми с "излиза", тъй като иначе се прикрепя към най-близкия ако. Което е установен в макро.)

Ако се интересувате от тези неща, които могат да се направят повече или по-малко безопасно с Препроцесорът С, вижте тази библиотека.

Някои от вас са показали, макроси с локални променливи, но никой не спомена, че не може просто да използвате всяко име в макро! Той хапе потребителя в един ден! Защо? Тъй като входните аргументи са заместени във вашия макро шаблон. И в макрореализациите примери използвате, са може би най-често се използва името на променливата аз.

Например, когато следния макрос

използван в следната функция

макроса няма да използва прогнозната променлива аз, обявен в началото на some_func, но локална променлива декларирана в цикъл от задачи. а.

Ето защо, никога не използвайте имената на общи променливи в макро!

Те ще бъдат прехвърлени към

имайте предвид, как аз ++ макро се оценява два пъти. Това може да доведе до някои интересни грешки.

По-добре, отколкото <> докато (0) и ако (1) <> друго. можете просто да използвате (<>).

И този синтаксис е съвместим с върнатите стойности (правя <> докато (0) не е), като се от:

Открих този трик е много полезна в ситуации, в които трябва да се справят с постоянно определена стойност. На всяко ниво на лечение, ако има някаква грешка или невалиден състояние, можете да се избегне по-нататъшна обработка и да избягат преди. например

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