Подскажите по поводу макроподстановки (#define)

 

Неоднократно встречал конструкцию, подобную такой:

#define PRINT_VAR(A) Print(#A,"=",A);

// ...

int abc=123;

// ...

PRINT_VAR(abc)  // Вывод в журнал: abc=123

Но в документации я не нашел ничего по поводу предварения токена символом '#' 

Подскажите, где это описано.

 
PapaYozh:

Неоднократно встречал конструкцию, подобную такой:

Но в документации я не нашел ничего по поводу предварения токена символом '#' 

Подскажите, где это описано.

Я не рылся в справке MQL5 (лень), но допускаю, что эту подробность могли упустить. Из вашего примеря ясно, что препроцессор, которому, в отличие от компилятора, доступны исходники в изначальном виде, передает компилеру кострукцию с подставленным именем токена А в качестве первого параметра, то есть, компилер на входе съест строку

Print("abc","=",abc);

А вообще, советую почитать статьи по дефайнам от Майкрософт, например тут и тут   Метаквоты в 2012 г. напряглись, и под чутким руководством CEO Рената Фатхулина забабахали в МТ4 вполне полноценные дефайны. Я на радостях тогда напился в юзю и даже ответно забабахал . Ибо до этого дефайны в МТ4 напоминали 3-дневного зародыша в женском чреве. Вообще, современный MQL4/5 довольно близок к плюсам, так что MSDN к вашим услугам.

Директива #define (C/C++)
Директива #define (C/C++)
  • 2022.09.27
  • corob-msft
  • learn.microsoft.com
Дополнительные сведения о директиве: #define (C/C++)
 
Alexey Volchanskiy #:

Я не рылся в справке MQL5 (лень), но допускаю, что эту подробность могли упустить. Из вашего примеря ясно, что препроцессор, которому, в отличие от компилятора, доступны исходники в изначальном виде, передает компилеру кострукцию с подставленным именем токена А в качестве первого параметра, то есть, компилер на входе съест строку

А вообще, советую почитать статьи по дефайнам от Майкрософт, например тут и тут   Метаквоты в 2012 г. напряглись, и под чутким руководством CEO Рената Фатхулина забабахали в МТ4 вполне полноценные дефайны. Я на радостях тогда напился в юзю и даже ответно забабахал . Ибо до этого дефайны в МТ4 напоминали 3-дневного зародыша в женском чреве. Вообще, современный MQL4/5 довольно близок к плюсам, так что MSDN к вашим услугам.

Алексей, а разве не сразу в 600+ билдах появились такие предопределённые дефайны

В зависимости от типа программы и режима компиляции стандартные макросы определяются следующим образом:

Макрос __MQL5__  доступен при компиляции файла *.mq5, при компиляции *.mq4 доступен макрос __MQL4__.

выделенные жёлтым.

Документация по MQL5: Основы языка / Препроцессор / Условная компиляция (#ifdef, #ifndef, #else, #endif)
Документация по MQL5: Основы языка / Препроцессор / Условная компиляция (#ifdef, #ifndef, #else, #endif)
  • www.mql5.com
Условная компиляция (#ifdef, #ifndef, #else, #endif) - Препроцессор - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
PapaYozh:

Неоднократно встречал конструкцию, подобную такой:

Но в документации я не нашел ничего по поводу предварения токена символом '#' 

Подскажите, где это описано.

Конкретного описания я не встречал, а пример в документации есть. 

Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
Предопределенные макроподстановки - Именованные константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
PapaYozh:

не нашел ничего по поводу предварения токена символом '#' 

#define MACROS(A) Print(#A); A

void OnStart()
{
  MqlTick Ticks[5];
  
  // Ниже обе строки идентичны.
  MACROS(ArrayPrint(Ticks));
  Print("ArrayPrint(Ticks)"); ArrayPrint(Ticks);
}
 
Alexey Viktorov #:

Алексей, а разве не сразу в 600+ билдах появились такие предопределённые дефайны

выделенные жёлтым.

Привет, помню тебя ))

Я посмотрел свое видео и дописал, ты прав. Но я уже не помню, может я тогда пропустил, может дополнили, ХЗ. Главное, сейчас девы в норме ))

 
fxsaber #:


Да, я пробовал подобный вариант.

PRINT_VAR(arr[0],arr[0]); //  == Print("arr[0]=",arr[0]);


PS. Я когда эксперементировал использовал 2 параметра. Понятно, что для принтов нужно избегать дублирования:

#define PRINT(A) \
Print(#A,":",A);
 

Хмм, вот проснулся и подумал, а когда я использую дефы?

И понял, что только для времянки.

 
fxsaber #:

О да, fxsaber любитель дефайнов. 

 
Alexey Volchanskiy #:


А вообще, советую почитать статьи по дефайнам от Майкрософт, например тут и тут   


Спасибо. То, что надо.

Я понял, что в макроподстановках MQL нельзя использовать charizing ( #@ ) operator, а в остальном синтаксис совдадает.


PS. Положу сюда ссылку, чтобы не искать в случае чего.

https://learn.microsoft.com/en-us/cpp/preprocessor/preprocessor-operators?view=msvc-170

Preprocessor operators
Preprocessor operators
  • 2021.08.03
  • corob-msft
  • learn.microsoft.com
Learn more about: Preprocessor operators
 
PapaYozh #:


Спасибо. То, что надо.

Я понял, что в макроподстановках MQL нельзя использовать charizing ( #@ ) operator, а в остальном синтаксис совдадает.


PS. Положу сюда ссылку, чтобы не искать в случае чего.

https://learn.microsoft.com/en-us/cpp/preprocessor/preprocessor-operators?view=msvc-170

Друг по разуму))

Не надо углубляться в козни Майкрософт. Я привел их MSDN чисто в качестве примера )). Я еще раз скажу: С++ близко похож на MQL, но именно близко 

Причина обращения: