|  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 | 
| Участник | Цитата:  В общем, когда создается подузел в 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. 
		
	 PS. Отсюда - мораль: надо чаще читать документацию   | 
|  | 
|  22.08.2008, 10:43 | #20 | 
| Developer | Цитата: 
		
			Сообщение от gl00mie
			   Мда, действительно. Опять тут возникает некоторая путаница из-за "упрощенного" синтаксиса   В общем, когда создается подузел в AOT\Macros, то включить текст этого узла в код можно с помощью директивы #macrolib.имя_макроса_в_AOT, хотя допускается "сокращенный" вариант - просто #имя_макроса_в_AOT... | 
|  |