Ошибки, баги, вопросы - страница 3335

Sergey Gridnev #:
Вроде, и должно быть "1"

Подсказка: комментарий /**/ - это пробел. Заменяем - получаем ожидаемый результат:

int i=0;
void f1() { if (!i++) Print(1); }
void f2() { if (!i++) Print(2); }
void OnStart()
{
    if (1)
#define MACRO     f1();
    f2();
}
и не перепутайте с другим примером. Здесь ошибка именно в комментарии /**/, а там была ошибка при переносе строки \

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

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

A100, 2023.06.01 10:42

Кстати перенос строки на #define - с ошибкой работает. Пример с ним ошибки при выполнении:

#define unsignedint    double
#define MACRO unsigned\
int
void OnStart()
{
    Print(sizeof(MACRO));
}

Результат:   4

Ожидалось: 8

A100 #:

Подсказка: комментарий /**/ - это пробел. Заменяем - получаем ожидаемый результат:

и не перепутайте с другим примером. Здесь ошибка именно в комментарии /**/, а там была ошибка при переносе строки \
Согласен
A100 #:

Подсказка: комментарий /**/ - это пробел. Заменяем - получаем ожидаемый результат:

Никогда не встречал внутри макроса какое-либо комментирование. Для того, чтобы удалить кусок из макроса, не комментировал, а удалял код внутри него.

Результат:   4

Ожидалось: 8

Перенос строки должен сшивать два слова? Это же текстовая замена, как в notepad.

fxsaber #:

Никогда не встречал внутри макроса какое-либо комментирование. Для того, чтобы удалить кусок из макроса, не комментировал, а удалял код внутри него.

#define подобен template, а template подобны обычным функциям. Внутри функций могу быть комментарии, а значит и внутри #define также могут быть комментарии. Кроме того, как Вы правильно заметили с помощью комментария можно исключить часть кода не удаляя его, т.е. использовать как переключатель контекста

И #define в отличии от template предоставляет куда более безграничные возможности. Поэтому в частности и непонятно почему число параметров в них в MQL ограничивается числом 8 - кроме простых сущностей толком ничего и записать нельзя

fxsaber #:

Перенос строки должен сшивать два слова? Это же текстовая замена, как в notepad.

В обычном языке перенос сам по себе сшивает слова

Мама мы-
ла раму

читается как

Мама мыла раму

а не

Мама мы ла раму

В С\C++ вместо дефиса '-' используется обратный слэш '\'

#define как Вы правильно заметили представляет собой текстовую замену, как допустим в notepad.

Это простые и интуитивно понятные всем несвязанные между собой Правила. Применяя их к коду последовательно: сначала #define, а затем перенос - получаем в результате: '4'. А как в MQL получилось '8' - это только Разработчики могу объяснить, при том, что у них обычный перенос не работает вообще:

A100 #:

Это простые и интуитивно понятные всем Правила.

Так сформулированные правила для меня совсем не просты и не интуитивны.

Знак переноса для того, чтобы сказать, что следующая строка является частью макроса - такое у меня интуитивное представление.

Комментарии, не относящиеся к этой теме, были перенесены в "Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам".
fxsaber #:

Так сформулированные правила для меня совсем не просты и не интуитивны.

Знак переноса для того, чтобы сказать, что следующая строка является частью макроса - такое у меня интуитивное представление.

Не просто частью, а именно продолжением (об этом даже в Документации сказано)

И в чем здесь противоречие Вашему пониманию?

#define MACRO unsigned\
int

Продолжаем - получаем

#define MACRO unsignedint
A100 #:

И в чем здесь противоречие Вашему пониманию?

В этом примере в моем понимании макрос состоит из двух строк. Т.е. после замены в "notepad" будет две строки.

A100 #:

Не просто частью, а именно продолжением (об этом даже в Документации сказано)

И в чем здесь противоречие Вашему пониманию?

Продолжаем - получаем

Если перед слэшем пробел поставить?

#define MACRO unsigned \
int
fxsaber #:

В этом примере в моем понимании макрос состоит из двух строк. Т.е. после замены в "notepad" будет две строки.

А где связь с Документацией?

Цитата: Каждая директива описывается отдельной записью и действует до переноса строки. Нельзя в одной записи использовать несколько директив. Если запись директивы получается слишком большой, то её можно разбить на несколько строк с помощью обратного слеша '\', в таком случае следующая строка будет считаться продолжением записи директивы.

Т.е. макрос не может состоять из двух строк - он всегда состоит из одной строки, но длинный макрос обратным слешем можно разбить так, что следующая строка будет считаться продолжением предыдущей

Artyom Trishkin #:

Если перед слэшем пробел поставить?

Если поставить пробел, то и результат будет с пробелом:

#define MACRO unsigned int