Определяю локальные так Code (Text): if DEBUG RESMNGRFINDRESS_LOCALVARS = 7 locals firsthandle dd ? ; maxpath dd ? ; pfileinfostruc dd ? ; offsettopath dd ? ; pcFileName dd ? ; newobjscount dd ? ; newresscount dd ? ; fileinfostruc WIN32_FIND_DATA endl else RESMNGRFINDRESS_LOCALVARS = 5 locals firsthandle dd ? ; maxpath dd ? ; pfileinfostruc dd ? ; offsettopath dd ? ; pcFileName dd ? ; fileinfostruc WIN32_FIND_DATA endl end if далее в коде Code (Text): lea reg, [firsthandle] не компилится и бредовая ошибка (мусор). Работает так Code (Text): locals RESMNGRFINDRESS_LOCALVARS = 5 firsthandle dd ? ; maxpath dd ? ; pfileinfostruc dd ? ; offsettopath dd ? ; pcFileName dd ? ; if DEBUG RESMNGRFINDRESS_LOCALVARS = 7 newobjscount dd ? ; newresscount dd ? ; end if fileinfostruc WIN32_FIND_DATA endl Почему не работает первый вариант? Вот так тоже не работает Code (Text): if DEBUG proc * uses *, *, *, dbg_var else proc * uses *, *, * end if
botmen Не мусор, а приводить ошибку надо. locals — макрос, т.е. раскрывается на этапе препроцессорной обработки. if-else-end if — директивы условного ассемблирования, т.е. обрабатываются после препроцессорной обработки. Т.о. будут сначала раскрыты оба макроса, в результате чего первый макрос locals определит локальный синоним символу firsthandle, а второй макрос locals переопределит символ firsthandle другим локальным синонимом. Соответственно использоваться firsthandle будет согласно синониму, определённому вторым блоком locals. Но на этапе ассемблирования метки второго блока не будут обработаны, если DEBUG <> 0. Отсюда будет возникать ошибка о неопределённой метке. Если же DEBUG = 0, всё должно скомпилироваться нормально. Отсюда мораль: использовать директиву условной препроцессорной обработки (match), а не условного ассемблирования (if-else-end if). И константу DEBUG соответственно определять, как символическую (equ или define), а не как числовую (знак равенства). Хотя вариант "работает так" лучше, конечно, чем использование match.
ох уж эти тонкие хитрожопости, в принципе я так и думал в мане постоянно пропускал раздел с match и как-то не отличал equ от =. для констант оно работает у match_а нет else, некрасиво получается ошибко така была undefined symbol '..var?aw' большое спасибо за подробность
botmen Ну да. Стандартный способ обхода этого неудобства такой: Code (Text): define matched - match something,something_else { ;if matched part restore matched define matched + } match -,matched { ;if not matched part } restore matched В частности поэтому вариант "работает так" лучше. Не помешала бы... раньше . ..var?aw — имя локального синонима (по факту просто значение) символа firsthandle, назначенное вторым макросом locals. Хотя первое значение (какой-нибудь ..var?aс) не исчезло, а осталось в стеке значений firsthandle.
Неинтуетивненько (прям как это слово), хотя какая мне разница что дублировать в код.) Ну, я так понял, при моём рабочем варианте в стеке переменные всё равно не выделяться - это и требуется. Решил остаться при старом, чтобы не патчить исходники. Разобрался и ладно, Добрый_Человек.