OOP, modelos e macros em mql5, sutilezas e usos - página 17

 
Taras Slobodyanik:

As macros retornam valores?

Bem, aqui está um exemplo de código

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#define  N    0.0
#define  S    0


  double Try_helper;
#define  Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0) {          \
     printf("Error: %s ", MES);      \
     return 4;                         \
   }

int OnInit()
  { int qw=S; 

   return(INIT_SUCCEEDED);}
  
 
Seric29:

Bem, aqui está um código de amostra

A substituição macro significa que todo aquele código (que está na definição), será substituído toda vez em um lugar especificado no programa. Então, de fato, em vez de fazer uma função e chamá-la, você copia esta função dentro do código muitas vezes, como um pedaço de código.

E se você faz oretorno de uma macro, é oretorno de todo o código onde esta macro está inserida.

 
Taras Slobodyanik:

A substituição macro significa que todo o código (que está na definição), será substituído toda vez no local especificado no programa. Na verdade, em vez de fazer uma função e chamá-la, você copia esta função dentro do código muitas vezes, como um pedaço de código.

E se você fizero retorno de uma macro, ele será o retorno de todo o código onde esta macro está inserida.

Acontece que não se pode escrever uma função macro.

 
Seric29:

Acontece que não há maneira de escrever uma função macro.

Uma substituição macro está substituindo um texto por outro (no código fonte), ela não pode ser uma função por definição.

 
Escreva sua opinião sobre istohttps://www.mql5.com/ru/forum/160683/page945#comment_12958065(número 9448)
 

Como escrever 2 macros sem saltar para uma nova linha, aumenta muito o número de linhas, o que prolonga muito o programa, aqui está um exemplo

#define  I int #define  B bool//это просто пример ни в коем случае не воспринимайте всерьёз

A Macro B não funciona mais.

 

é possível converter um nome variável em uma string?

Não funciona dessa forma:

#define  p_func(NAME)  Print("This is ##NAME")
//+------------------------------------------------------------------+
void OnStart()
{
   int QWERTY;
   int zxcvbn;
   p_func(QWERTY);	//This is ##NAME
   p_func(zxcvbn);	//This is ##NAME
}
 
Seric29:
Pessoal, eu quero escrever uma macro de makros(a) e funcionará assim: se for igual a 1, retornará qualquer valor do tipo int, se for igual a 2, retornará qualquer valor do tipo duplo, se for igual a 3, retornará qualquer valor do tipo bool. É possível fazer isso?

Para quê? Para quê? Onde você vai utilizá-lo?

 
Igor Makanu:

é possível converter um nome variável em uma string?

#define  p_func(NAME)  Print("This is " + #NAME)
 
Seric29:
Caras, esta pergunta que eu quero escrever um macro makros(a), funcionará assim: se a é igual a 1ce então a macro retornará qualquer valor do tipo int, se a é igual a 2ke então a macro retornará qualquer valor do tipo double, se a é igual a 3ke então a macro retornará qualquer valor do tipo bool. É possível fazer isso?
#define  GET_HELPER_1 1
#define  GET_HELPER_2 1.0
#define  GET_HELPER_3 true
#define  GET_EXPAND(I) GET_HELPER_##I
#define  GET(I) GET_EXPAND(I)

void OnStart() {
   Alert(GET(1), "  ", GET(2), "  ", GET(3));
}

Em µl, você pode fazer sem GET_EXPAND, mas é material específico para µl, é mais correto. Bem, μl macros são muito limitadas devido à falta de operador de vírgula (embora através de muletas ...).

ZZY: e tudo isso é tempo de compilação, é claro.

ZZZY: a propósito, se houvesse um operador fantasma, você poderia fazer isso:

class Q{
public:
        operator int();
        operator double();
        operator bool();
};
...
Q q;
int i = q;      // call operator int
double d = q;   // call operator double
bool b = q;     // ...
Razão: