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