![]() |
#1 |
Гость
|
Что такое #if.never ?
В RunBase в прототипах методов встретил кучу таких макросов - что они значат и когда выполняются?
P.s. Самое смешное, что не умею я пользоваться поиском по форумам... Например на поиск "#if.never" этот форум ругнулся 2 раза: if короткое, never - короткое.. |
|
![]() |
#2 |
Участник
|
Это значит, что код этот никогда не будет выполняться
Много примеров использования схожих конструкций - в Tabax и его плагинах. называется конструкция - условная компиляция |
|
![]() |
#3 |
очами вижу
|
|
|
![]() |
#4 |
Участник
|
AOT\Macros
![]() Опять же, смотрите примеры в реализации Tabax. Там условно компилируются определенные части кода в зависимости от версии системы. Для этого используется макрос #AOT, в котором в АХ4 и АХ2009 добавлялись новые пункты |
|
![]() |
#5 |
очами вижу
|
Цитата:
#define.never где-нибудь, чтобы он везде сработал. Чтобы он стал объявленным во всех модулях независимо от импортируемых каждым модулем макросов. Насколько я понял, макрос #AOT тоже импортируется вручную, как и любой другой из AOT\Macros. |
|
![]() |
#6 |
Гость
|
|
|
![]() |
#7 |
Axapta
|
Да, кстати. Если написать #if.always, то ничего не изменится.
![]() |
|
![]() |
#8 |
Участник
|
В том то вся суть - они нигде не объявлены видимо
![]() |
|
![]() |
#9 |
очами вижу
|
А что должно измениться? always же тоже нигде не объявлен.
X++: info("Test1"); #if.always info("Test2"); #endif #if.never info("Test3"); #endif X++: #define.never #define.always |
|
![]() |
#10 |
Участник
|
Добавлю, на всякий случай, что единственным логическим отличием конструкции #if.never ... #endif от блочного комментария /* ... */ является подсветка в редакторе кода, для чего собственно все это и задумывалось.
И этим надо обязательно пользоваться в подходящих случаях. |
|
![]() |
#11 |
Участник
|
Иван правильно пишет, макро #never нигде не объявлен.
С таким же успехом можно написать что угодно: #if.qwerty , #if.Россия и т.д. ![]() never - общепринятое слово в таких случаях |
|
![]() |
#12 |
Axapta
|
|
|
![]() |
#13 |
очами вижу
|
|
|
![]() |
#14 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: aidsua (1). |
![]() |
#15 |
очами вижу
|
Цитата:
Сообщение от gl00mie
![]() Можно - для этого в макросе надо вместо define'ов сразу писать текст (кусок кода, например), который вы хотите подставлять в местах использования макроса. В этих местах вам надо будет указать само название макроса с '#', см., например, макрос FilePathDelimiter. А, скажем, в макросе InventDimJoin можно посмотреть, как использовать переданные макросу параметры. Главное тут - не увлекаться, чтобы не ухудшать читаемость кода (см. A rant against flow control macros).
Мы видим, что в некоторых модулях проверяется наличие макроса never (для чего это сделано в данном случае неважно), но так как он не определен, код внутри этих команд препроцессора не компилируется. Желание таково: заставить компилироваться код внутри этих #if-ов. В C++ достаточно добавить такой дефайн в параметры компилятора, чтобы он был определен во всех модулях. Можно ли в аксапте сделать так же? |
|
![]() |
#16 |
Участник
|
Цитата:
Сообщение от RumataEstor
![]() Наверное, я в третий раз плохо описываю свое желание. Мы видим, что в некоторых модулях проверяется наличие макроса never (для чего это сделано в данном случае неважно), но так как он не определен, код внутри этих команд препроцессора не компилируется. Желание таково: заставить компилироваться код внутри этих #if-ов.
|
|
![]() |
#17 |
Участник
|
Цитата:
Сообщение от gl00mie
![]() Ну дык ить... я же написал: достаточно создать в узле AOT\Macros макрос с названием never и в этом макросе написать что-нить, например, просто "1" (без кавычек), после чего запустить глобальную компилляцию. Только это все теория - ни в коем случае не создавайте на самом деле такой макрос, а то поломаете приложение в куче мест!
Это должен быть именно #define.Something Макросы в АОТ не покатят. В ответ на вопрос RumataEstor: опять же, нет, думаю такого места нет |
|
|
За это сообщение автора поблагодарили: gl00mie (5). |
![]() |
#18 |
очами вижу
|
Цитата:
Сообщение от gl00mie
![]() Ну дык ить... я же написал: достаточно создать в узле AOT\Macros макрос с названием never и в этом макросе написать что-нить, например, просто "1" (без кавычек), после чего запустить глобальную компилляцию. Только это все теория - ни в коем случае не создавайте на самом деле такой макрос, а то поломаете приложение в куче мест!
Жаль |
|
![]() |
#19 |
Участник
|
Цитата:
![]() ![]() Цитата:
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.
PS. Отсюда - мораль: надо чаще читать документацию ![]() |
|
![]() |
#20 |
Developer
|
Цитата:
Сообщение от gl00mie
![]() Мда, действительно. Опять тут возникает некоторая путаница из-за "упрощенного" синтаксиса
![]() |
|