Как я могу использовать макросы в Delphi?

Как я могу использовать макросы в Delphi? Эта функция доступна в FPC уже довольно давно. Можно ли это сделать с помощью событий до или после сборки?

Пример:

{$define sum:=a:=a+b;}  

person user3764855    schedule 03.07.2014    source источник
comment
Макросы в FPC предназначены для нескольких простых случаев (например, простые макросы {$ifdef mswindows} stdcall{$else}cdecl{$endif}. Они не предназначены для общего программирования, поэтому их нельзя параметризовать. правильные решения для случаев, когда простой C использует макросы.   -  person Marco van de Voort    schedule 03.07.2014
comment
Вы думаете об условных символах. {$DEFINE} в FreePascal более гибкий, чем в Delphi. FreePascal поддерживает определение целых выражений, которые можно подставлять в код во время компиляции, аналогично макросам препроцессора C. Прочтите Раздел 2.2 документации FreePascal.   -  person Remy Lebeau    schedule 03.07.2014
comment
@RemyLebeau Я думаю о {$Macro ON} в FPC   -  person user3764855    schedule 03.07.2014
comment
Когда используется {$MACRO ON}, {$DEFINE} может определять выражения, а не только имена символов. Такие расширенные макросы НЕ предназначены для простых случаев и предназначены для общего программирования. Это то, что я не согласен с вашим предыдущим комментарием.   -  person Remy Lebeau    schedule 04.07.2014
comment
@RemyLebeau Да, я бы хотел, чтобы это было в Delphi. Довольно полезно.   -  person user3764855    schedule 04.07.2014


Ответы (2)


Вы не можете использовать макросы в Delphi. Такой функциональности не существует. Ближайшей встроенной функциональностью будет функция inline.


Конечно, вы могли бы написать свой собственный препроцессор, расширяющий макросы. Однако вы не сможете хорошо интегрировать это с IDE. По крайней мере, не так, как я считаю приемлемым.

Проблема в том, куда расширить макрос. Вы вряд ли сможете расширить его до исходного файла, потому что вы не сможете реально его изменить. Поэтому вам нужно расширить временный файл. И у компилятора нет механизма сборки из временных файлов. Я полагаю, вы могли бы расшириться до включаемого файла. Это может быть лучшим вариантом, но с ним будет ужасно работать. Например, подумайте о развлечении при отладке.

person David Heffernan    schedule 03.07.2014
comment
Вы можете использовать внешний препроцессор. Вы, кажется, пропустили это. - person user3764855; 03.07.2014
comment
Ясно, что вы можете написать любые внешние инструменты, которые вам нравятся, для генерации кода, но на самом деле это не использование макросов в Delphi в соответствии с вопросом. - person David Heffernan; 03.07.2014
comment
Я согласен, что inline выглядит очень похоже на макрос в мире cpp - person stanleyxu2005; 03.07.2014
comment
@ stanleyxu2005 вы не можете всегда встраиваться. В документации есть целый список. - person user3764855; 03.07.2014
comment
@ stanleyxu2005 Это не очень похоже. Макросы — это простая замена текста, они невероятно бесплатные и мощные. С этой силой приходит возможность для эпических масштабов злоупотреблений! Все зависит от препроцессора как части цепочки компиляции, которой просто нет в Delphi. - person David Heffernan; 03.07.2014
comment
@user3764855 user3764855 Поскольку в Delphi нет макросов и поскольку написание собственного препроцессора, вероятно, неудобно, возможно, вы могли бы рассказать нам, что мотивирует вопрос, и мы посмотрим, сможем ли мы дать совет по наилучшему возможному решению Delphi. - person David Heffernan; 03.07.2014
comment
@user3764855 user3764855 Неприятно использовать. Подумайте, как это будет работать с отладчиком. Какой исходный файл будет использоваться. Я думаю, вы уже решили, что макросы — единственное возможное решение вашей проблемы, и не хотите рассказывать нам, в чем проблема. - person David Heffernan; 03.07.2014

Delphi не предоставляет встроенных функций для макросов. Возможно, вам нужен DWScript.

person stanleyxu2005    schedule 03.07.2014
comment
Что ж, если мы готовы использовать другие инструменты, то FPC, упомянутый в вопросе, звучит как кандидат ...... - person David Heffernan; 03.07.2014