Баг компилятора: not actual parameters count for macro

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Navoykov
4571
Alexey Navoykov  

Билд 1966, 64 бит.   Ошибка в макросах:

void F(int,int) {  }


#define M(a)  F(a, 0)

#define F(a)  M(a)


void OnInit()
{
  F(1);  // 'F' - not actual parameters count for macro
}

В C++ работает корректно.

Ilyas
1442
Ilyas  

Спасибо за сообщение.

В текущей версии MQL, развёртываемый макрос, не помечается как отсутствующий, отсюда данная ошибка и ограничение в глубину при развертывании макросов.

Т.е. по приведённому коду, при развёртывании макроса F, сам макрос F должен "притворится" необъявленным, тогда при развёртывании макроса M, F(a,0) окажется вызовом, а не макросом F (при чём развёртываемом рекурсивно)

Буду исправлять.

pavlick_
773
pavlick_  

Ну с той же оперы примерно

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

pavlick_, 2018.12.05 05:00

#define M (a ? 1 : 0)

struct S {
   int a;
};

void OnStart()
{
   S s;
#define a s.a
   Alert(M);
}

Скомпилировать не удаётся, ошибки:
   'a' - too complex, simplify the macro    temp.mq5    24    10
   's' - struct member undefined    temp.mq5    24    10
   ...

Т.е. препроцессор,  видимо, пытается рекурсивно раскрыть a.


Ilyas
1442
Ilyas  

Исправления внесены.

Оба приведённых кода компилируются без ошибок.

Ограничил вложенность раскручиваемых макросов до 64 (в последней ревизии было 16, изначально 8).

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий