AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.08.2008, 16:32   #1  
Shakr
Гость
 
n/a
Что такое #if.never ?
В RunBase в прототипах методов встретил кучу таких макросов - что они значат и когда выполняются?

P.s. Самое смешное, что не умею я пользоваться поиском по форумам... Например на поиск "#if.never" этот форум ругнулся 2 раза: if короткое, never - короткое..
Старый 20.08.2008, 16:48   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Это значит, что код этот никогда не будет выполняться
Много примеров использования схожих конструкций - в Tabax и его плагинах.

называется конструкция - условная компиляция
Старый 20.08.2008, 16:50   #3  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Это значит, что код этот никогда не будет выполняться
Много примеров использования схожих конструкций - в Tabax и его плагинах.

называется конструкция - условная компиляция
А можно ли определить макрос сразу на все приложение?
Старый 20.08.2008, 16:52   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
AOT\Macros
Опять же, смотрите примеры в реализации Tabax.
Там условно компилируются определенные части кода в зависимости от версии системы.
Для этого используется макрос #AOT, в котором в АХ4 и АХ2009 добавлялись новые пункты
Старый 20.08.2008, 17:25   #5  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от kashperuk Посмотреть сообщение
AOT\Macros
Опять же, смотрите примеры в реализации Tabax.
Там условно компилируются определенные части кода в зависимости от версии системы.
Для этого используется макрос #AOT, в котором в АХ4 и АХ2009 добавлялись новые пункты
Я имел ввиду способ объявить, например, это
#define.never
где-нибудь, чтобы он везде сработал. Чтобы он стал объявленным во всех модулях независимо от импортируемых каждым модулем макросов.
Насколько я понял, макрос #AOT тоже импортируется вручную, как и любой другой из AOT\Macros.
Старый 20.08.2008, 17:33   #6  
Shakr
Гость
 
n/a
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Это значит, что код этот никогда не будет выполняться
Много примеров использования схожих конструкций - в Tabax и его плагинах.

называется конструкция - условная компиляция
Спасибо
Старый 20.08.2008, 17:40   #7  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Да, кстати. Если написать #if.always, то ничего не изменится.
Старый 20.08.2008, 17:51   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
В том то вся суть - они нигде не объявлены видимо
Старый 20.08.2008, 18:11   #9  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от oip Посмотреть сообщение
Да, кстати. Если написать #if.always, то ничего не изменится.
А что должно измениться? always же тоже нигде не объявлен.
X++:
info("Test1");
#if.always
info("Test2");
#endif
#if.never
info("Test3");
#endif
выдает только "Test1", пока не объявишь
X++:
#define.never
#define.always
Старый 20.08.2008, 18:15   #10  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Добавлю, на всякий случай, что единственным логическим отличием конструкции #if.never ... #endif от блочного комментария /* ... */ является подсветка в редакторе кода, для чего собственно все это и задумывалось.

И этим надо обязательно пользоваться в подходящих случаях.
Старый 20.08.2008, 18:24   #11  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Иван правильно пишет, макро #never нигде не объявлен.
С таким же успехом можно написать что угодно: #if.qwerty , #if.Россия и т.д.
never - общепринятое слово в таких случаях
Старый 20.08.2008, 18:28   #12  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
А что должно измениться? always же тоже нигде не объявлен.]
Я и имею в виду, что never - это не магическое слово какое-то, а просто удобное в данном случае, чтобы по названию смысл был понятен.
Старый 20.08.2008, 18:40   #13  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от oip Посмотреть сообщение
Я и имею в виду, что never - это не магическое слово какое-то, а просто удобное в данном случае, чтобы по названию смысл был понятен.
Ясно.
А вот мне интересно, можно ли объявить макрос так, чтобы он сразу стал доступен во всех модулях?
Старый 21.08.2008, 12:32   #14  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
можно ли объявить макрос так, чтобы он сразу стал доступен во всех модулях?
Можно - для этого в макросе надо вместо define'ов сразу писать текст (кусок кода, например), который вы хотите подставлять в местах использования макроса. В этих местах вам надо будет указать само название макроса с '#', см., например, макрос FilePathDelimiter. А, скажем, в макросе InventDimJoin можно посмотреть, как использовать переданные макросу параметры. Главное тут - не увлекаться, чтобы не ухудшать читаемость кода (см. A rant against flow control macros).
За это сообщение автора поблагодарили: aidsua (1).
Старый 21.08.2008, 14:31   #15  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Можно - для этого в макросе надо вместо define'ов сразу писать текст (кусок кода, например), который вы хотите подставлять в местах использования макроса. В этих местах вам надо будет указать само название макроса с '#', см., например, макрос FilePathDelimiter. А, скажем, в макросе InventDimJoin можно посмотреть, как использовать переданные макросу параметры. Главное тут - не увлекаться, чтобы не ухудшать читаемость кода (см. A rant against flow control macros).
Наверное, я в третий раз плохо описываю свое желание.
Мы видим, что в некоторых модулях проверяется наличие макроса never (для чего это сделано в данном случае неважно), но так как он не определен, код внутри этих команд препроцессора не компилируется.
Желание таково: заставить компилироваться код внутри этих #if-ов.

В C++ достаточно добавить такой дефайн в параметры компилятора, чтобы он был определен во всех модулях. Можно ли в аксапте сделать так же?
Старый 21.08.2008, 14:38   #16  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от RumataEstor Посмотреть сообщение
Наверное, я в третий раз плохо описываю свое желание. Мы видим, что в некоторых модулях проверяется наличие макроса never (для чего это сделано в данном случае неважно), но так как он не определен, код внутри этих команд препроцессора не компилируется. Желание таково: заставить компилироваться код внутри этих #if-ов.
Ну дык ить... я же написал: достаточно создать в узле AOT\Macros макрос с названием never и в этом макросе написать что-нить, например, просто "1" (без кавычек), после чего запустить глобальную компилляцию. Только это все теория - ни в коем случае не создавайте на самом деле такой макрос, а то поломаете приложение в куче мест!
Старый 21.08.2008, 15:38   #17  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Ну дык ить... я же написал: достаточно создать в узле AOT\Macros макрос с названием never и в этом макросе написать что-нить, например, просто "1" (без кавычек), после чего запустить глобальную компилляцию. Только это все теория - ни в коем случае не создавайте на самом деле такой макрос, а то поломаете приложение в куче мест!
Не, такое не будет работать.
Это должен быть именно #define.Something

Макросы в АОТ не покатят.

В ответ на вопрос RumataEstor: опять же, нет, думаю такого места нет
За это сообщение автора поблагодарили: gl00mie (5).
Старый 21.08.2008, 16:35   #18  
RumataEstor is offline
RumataEstor
очами вижу
 
84 / 19 (1) ++
Регистрация: 29.04.2008
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Ну дык ить... я же написал: достаточно создать в узле AOT\Macros макрос с названием never и в этом макросе написать что-нить, например, просто "1" (без кавычек), после чего запустить глобальную компилляцию. Только это все теория - ни в коем случае не создавайте на самом деле такой макрос, а то поломаете приложение в куче мест!
Проверил. Не работает.

Цитата:
Сообщение от kashperuk Посмотреть сообщение
Не, такое не будет работать.
Это должен быть именно #define.Something

Макросы в АОТ не покатят.

В ответ на вопрос RumataEstor: опять же, нет, думаю такого места нет
Жаль
Миниатюры
Нажмите на изображение для увеличения
Название: macrotest.PNG
Просмотров: 389
Размер:	35.1 Кб
ID:	3640  
Старый 21.08.2008, 16:43   #19  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Не, такое не будет работать. Это должен быть именно #define.Something Макросы в АОТ не покатят.
Мда, действительно. Опять тут возникает некоторая путаница из-за "упрощенного" синтаксиса В общем, когда создается подузел в AOT\Macros, то включить текст этого узла в код можно с помощью директивы #macrolib.имя_макроса_в_AOT, хотя допускается "сокращенный" вариант - просто #имя_макроса_в_AOT. В то же время, для препроцессора (как выясняется ) макрос как тот или иной узел в AOT\Macros и макрос, определенный с помощью директив #define/#globaldefine, суть вещи разные. По крайней мере, в Ms Dynamics SDK в разделе «How to: Use the #macrolib Directive for AOT Macro Libraries» пишут
Цитата:
The #if and #undef directives do not apply to #macrolib names. However, they do apply to #define directives that are the contents of a #macrolib macro.
И еще там же есть раздел «Range of Macro Referencing», где подробно объясняется, как препроцессор определяет область видимости макроса (опять же, с точки зрения директивы #if макросом является то, что объявлено с помощью директив #define/#globaldefine) - никаких "единых для всего приложения" мест там не упоминается...

PS. Отсюда - мораль: надо чаще читать документацию
Старый 22.08.2008, 10:43   #20  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Мда, действительно. Опять тут возникает некоторая путаница из-за "упрощенного" синтаксиса В общем, когда создается подузел в AOT\Macros, то включить текст этого узла в код можно с помощью директивы #macrolib.имя_макроса_в_AOT, хотя допускается "сокращенный" вариант - просто #имя_макроса_в_AOT...
Хотелось бы отметить, что в тройке (по крайней мере до SP2 включительно) при использовании "сокращенного" варианта в конструкциях #macro, #localmacro, #globalmacro не будут доступны параметры %1, %2, ...
Теги
ax2009, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
if (record) vs if (record.RecId) kashperuk DAX: Программирование 18 27.11.2008 18:53
if (record) в случае join с использованием group by kashperuk DAX: Программирование 9 07.12.2007 15:11
If iexplore.exe suxx... EVGL DAX: База знаний и проекты 16 29.06.2007 11:51
InventJournalTrans DreamCreator DAX: Программирование 7 14.12.2004 14:48
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:09.