MSVC2022/2026 не видит макрос, вернее, пытается его как-то трактовать...
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.11.25 19:58
Оценка:
Здраыствуйте!

MSVC не видит макрос, причем у 2026 таких случаев сильно больше, но суть одна. Или даже похоже, что оно пытается до раскрытия макросов какие-то выводы делать.
Предыдущие студии нормально компилируют, GCC, вплоть до 15го, также нормально все компилирует.

Вот прямо перед использованием проверяю его существование — останавливается по ошибке "UMBA_RULE_OF_FIVE is defined before use". Отключаю проверку — получаю "Function definition for 'UMBA_RULE_OF_FIVE' not found."

Что за бред?

#if 0
#ifdef UMBA_RULE_OF_FIVE
    #error "UMBA_RULE_OF_FIVE is defined before use"
#else
    #error "UMBA_RULE_OF_FIVE is NOT defined before use"
#endif
#endif

struct ICommandLineOptionCollector
{
    UMBA_RULE_OF_FIVE(ICommandLineOptionCollector, default, default, default, default, default);

    //...
};
Маньяк Робокряк колесит по городу
Re: MSVC2022/2026 не видит макрос, вернее, пытается его как-то трактовать...
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.11.25 20:21
Оценка:
Здравствуйте, Marty, Вы писали:

M>Вот прямо перед использованием проверяю его существование — останавливается по ошибке "UMBA_RULE_OF_FIVE is defined before use". Отключаю проверку — получаю "Function definition for 'UMBA_RULE_OF_FIVE' not found."


А во что он определён?

Например, если определить его так:

#define UMBA_RULE_OF_FIVE(p1,p2,p3,p4,p5) ((UMBA_RULE_OF_FIVE)(p1,p2,p3,p4,p5))


То он развернётся ровно вот в вызов функции. А если функция не определена, то и будет того-сь.
Re[2]: MSVC2022/2026 не видит макрос, вернее, пытается его как-то трактовать...
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.11.25 20:29
Оценка:
Здравствуйте, Pzz, Вы писали:

M>>Вот прямо перед использованием проверяю его существование — останавливается по ошибке "UMBA_RULE_OF_FIVE is defined before use". Отключаю проверку — получаю "Function definition for 'UMBA_RULE_OF_FIVE' not found."


Pzz>А во что он определён?


Он разворачивается в ctor по умолчанию, ctor/op= копирования и перемещения


Pzz>Например, если определить его так:


Pzz>
Pzz>#define UMBA_RULE_OF_FIVE(p1,p2,p3,p4,p5) ((UMBA_RULE_OF_FIVE)(p1,p2,p3,p4,p5))
Pzz>


Pzz>То он развернётся ровно вот в вызов функции. А если функция не определена, то и будет того-сь.


Ты не в курсе про плюсовое правило пяти, просто. Он разворачивается во что надо, и раньше работало везде, а в GCC и сейчас работает.


  rule_of_five.h
/*!
    \file
    \brief Макросы для правила пяти - надоело руками выписывать. Правило пяти - https://habr.com/ru/companies/otus/articles/800089/
 */
#pragma once


//! Часть правила пяти для конструктора по умолчанию (устаревшее определение)
/*!
    UMBA_RULE_OF_FIVE_DEF(className, default|delete);
*/
#define  UMBA_RULE_OF_FIVE_DEF(className, ctorDef)  className () = ctorDef

//! Часть правила пяти для конструктора по умолчанию
/*!
    UMBA_RULE_OF_FIVE_CTOR(className, default|delete);
*/
#define  UMBA_RULE_OF_FIVE_CTOR(className, ctorDef) className () = ctorDef

//! Конструктор по умолчанию - по умолчанию
/*!
    UMBA_RULE_OF_FIVE_CTOR_DEFAULT(className);
*/
#define  UMBA_RULE_OF_FIVE_CTOR_DEFAULT(className)  UMBA_RULE_OF_FIVE_CTOR(className, default)
         
//! Конструктор по умолчанию - запрещён
/*!
    UMBA_RULE_OF_FIVE_CTOR_DELETE(className);
*/
#define  UMBA_RULE_OF_FIVE_CTOR_DELETE(className)   UMBA_RULE_OF_FIVE_CTOR(className, delete)
         



//! Часть правила пяти для конструктора и оператора копирования
/*!
    UMBA_RULE_OF_FIVE_COPY(className, default|delete, default|delete);
*/
#define  UMBA_RULE_OF_FIVE_COPY(className, ctorCopy, opCopy) \
         className (const className &) = ctorCopy;              \
         className & operator= (const className &) = opCopy



//! Часть правила пяти для конструктора и оператора перемещения
/*!
    UMBA_RULE_OF_FIVE_MOVE(className, default|delete, default|delete);
*/
#define  UMBA_RULE_OF_FIVE_MOVE(className, ctorMove, opMove) \
         className (className &&) = ctorMove;                   \
         className & operator=(className &&) = opMove


//! Часть правила пяти для конструктора и оператора копирования и конструктора и оператора перемещения, без конструктора по умолчанию
/*!
    UMBA_RULE_OF_FIVE_COPY_MOVE(className, default|delete, default|delete, default|delete, default|delete);
*/
#define  UMBA_RULE_OF_FIVE_COPY_MOVE(className, ctorCopy, opCopy, ctorMove, opMove) \
         UMBA_RULE_OF_FIVE_COPY(className, ctorCopy, opCopy);                       \
         UMBA_RULE_OF_FIVE_MOVE(className, ctorMove, opMove)



//! Макрос для полного правила пяти
/*!
    UMBA_RULE_OF_FIVE(className, default|delete, default|delete, default|delete, default|delete, default|delete);
*/
#define  UMBA_RULE_OF_FIVE(className, ctorDef, ctorCopy, opCopy, ctorMove, opMove)  \
         UMBA_RULE_OF_FIVE_CTOR(className, ctorDef);                                \
         UMBA_RULE_OF_FIVE_COPY(className, ctorCopy, opCopy);                       \
         UMBA_RULE_OF_FIVE_MOVE(className, ctorMove, opMove)



//! Копирование - по умолчанию
/*!
    UMBA_RULE_OF_FIVE_COPY_DEFAULT(className);
*/
#define  UMBA_RULE_OF_FIVE_COPY_DEFAULT(className) UMBA_RULE_OF_FIVE_COPY(className, default, default)

//! Копирование запрещено
/*!
    UMBA_RULE_OF_FIVE_COPY_DELETE(className);
*/
#define  UMBA_RULE_OF_FIVE_COPY_DELETE(className) UMBA_RULE_OF_FIVE_COPY(className, delete, delete)


//! Перемещение - по умолчанию
/*!
    UMBA_RULE_OF_FIVE_MOVE_DEFAULT(className);
*/
#define  UMBA_RULE_OF_FIVE_MOVE_DEFAULT(className) UMBA_RULE_OF_FIVE_MOVE(className, default, default)

//! Перемещение запрещено
/*!
    UMBA_RULE_OF_FIVE_MOVE_DELETE(className);
*/
#define  UMBA_RULE_OF_FIVE_MOVE_DELETE(className) UMBA_RULE_OF_FIVE_MOVE(className, delete, delete)


//! Копирование и перемещение - по умолчанию
/*!
    UMBA_RULE_OF_FIVE_COPY_MOVE_DEFAULT(className);
*/
#define  UMBA_RULE_OF_FIVE_COPY_MOVE_DEFAULT(className) UMBA_RULE_OF_FIVE_COPY_MOVE(className, default, default, default, default)


//! Копирование и перемещение - запрещено
/*!
    UMBA_RULE_OF_FIVE_COPY_MOVE_DELETE(className);
*/
#define  UMBA_RULE_OF_FIVE_COPY_MOVE_DELETE(className) UMBA_RULE_OF_FIVE_COPY_MOVE(className, delete, delete, delete, delete)


//! Конструктор по умолчанию, копирование и перемещение - по умолчанию
/*!
    UMBA_RULE_OF_FIVE_DEFAULT(className);
*/
#define  UMBA_RULE_OF_FIVE_DEFAULT(className) UMBA_RULE_OF_FIVE(className, default, default, default, default, default)


//! Конструктор по умолчанию, копирование и перемещение - запрещено
/*!
    UMBA_RULE_OF_FIVE_DELETE(className);
*/
#define  UMBA_RULE_OF_FIVE_DELETE(className) UMBA_RULE_OF_FIVE(className, delete, delete, delete, delete, delete)
Маньяк Робокряк колесит по городу
Re: MSVC2022/2026 не видит макрос, вернее, пытается его как-то трактовать...
От: so5team https://stiffstream.com
Дата: 28.11.25 04:01
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>Что за бред?


Ну вы-то вроде и в программировании, и на форумах в интернете, далеко уже не мальчик, неужели так трудно проиллюстрировать свою проблему минимальным воспроизводимым примером с ссылкой на godbolt (ну или на тестовые репозиторий на github/gitlab)?
Re: MSVC2022/2026 не видит макрос, вернее, пытается его как-то трактовать...
От: B0FEE664  
Дата: 28.11.25 09:39
Оценка:
Здравствуйте, Marty, Вы писали:

M>Вот прямо перед использованием проверяю его существование — останавливается по ошибке "UMBA_RULE_OF_FIVE is defined before use". Отключаю проверку — получаю "Function definition for 'UMBA_RULE_OF_FIVE' not found."

M>Что за бред?

Скорее всего разный (и условный) порядок подключения инклюдов в разных файлах компиляции.
И каждый день — без права на ошибку...
Re[2]: MSVC2022/2026 не видит макрос, вернее, пытается его к
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.11.25 11:57
Оценка:
Здравствуйте, B0FEE664, Вы писали:

M>>Вот прямо перед использованием проверяю его существование — останавливается по ошибке "UMBA_RULE_OF_FIVE is defined before use". Отключаю проверку — получаю "Function definition for 'UMBA_RULE_OF_FIVE' not found."

M>>Что за бред?

BFE>Скорее всего разный (и условный) порядок подключения инклюдов в разных файлах компиляции.


Порядок разный, да. Но не условный. Хидер, в котором объявлен макрос, защищён только #pragma once. Он может где-то ещё включаться, но точно включается в том файле, где происходила ошибка

Более того, я проверял определение через #if defined() — срабатывало, и останавливалось там на #error. Если #error закоментировать — то опять ошибка.

Решил попытаться локализовать проблему, сделал тестик, там подключается только один мой файл, объявил структуру, в которой только мой макрос и всё — ошибка воспроизводится. Сделал второй тест — убрал инклюд, вставил непосредственно его содержимое — ошибка воспроизводится. Потом ещё приседал по разному — и вдруг ошибка перестала вопроизводится.

У меня проект на симейке. Закрыл студию, удалил все файлы, перегенерил заново, запустил, собираю и так и сяк — ошибка не воспроизводится. Всё работает и в 2022 и в 2026ой студиях.

Еще была куча предупреждений, типа pBuf используется до инициализации. Но как же до, когда тремя строчками выше pBuf явно присваивается.

И вообще куча предупреждений была. Кое-какие при этом были полезными. А сейчас всё собирается с нулём ошибок, предупреждений, и даже сообщений.

Что это было, я так и не понял, но всё заработало.

Да, только только поставил 2026ую студию, комп не перегружал. Но и перед тем, как всё заработало — тоже не перегружал. В общем, сижу в непонятках
Маньяк Робокряк колесит по городу
Отредактировано 29.11.2025 12:35 Marty . Предыдущая версия .
Re[3]: MSVC2022/2026 не видит макрос, вернее, пытается его к
От: B0FEE664  
Дата: 02.12.25 13:28
Оценка:
Здравствуйте, Marty, Вы писали:

M>У меня проект на симейке. Закрыл студию, удалил все файлы, перегенерил заново, запустил, собираю и так и сяк — ошибка не воспроизводится. Всё работает и в 2022 и в 2026ой студиях.


Такое возможно, если на разных подключаемых путях лежат файлы с одинаковым именем, но разным содержимым.
Ещё может быть глюк при использовании precompiled header.
И каждый день — без права на ошибку...
Re[4]: MSVC2022/2026 не видит макрос, вернее, пытается его к
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 02.12.25 18:49
Оценка:
Здравствуйте, B0FEE664, Вы писали:

M>>У меня проект на симейке. Закрыл студию, удалил все файлы, перегенерил заново, запустил, собираю и так и сяк — ошибка не воспроизводится. Всё работает и в 2022 и в 2026ой студиях.


BFE>Такое возможно, если на разных подключаемых путях лежат файлы с одинаковым именем, но разным содержимым.


Такого нет


BFE>Ещё может быть глюк при использовании precompiled header.


Не используются
Маньяк Робокряк колесит по городу
Re[3]: MSVC2022/2026 не видит макрос, вернее, пытается его к
От: Skorodum Россия  
Дата: 03.12.25 10:06
Оценка:
Здравствуйте, Marty, Вы писали:

M>Порядок разный, да. Но не условный. Хидер, в котором объявлен макрос, защищён только #pragma once. Он может где-то ещё включаться, но точно включается в том файле, где происходила ошибка

Недавно столкнулся с проблемой, когда #pragma once не работала в расшаренной папке на виртуальной машине.
Re[4]: MSVC2022/2026 не видит макрос, вернее, пытается его к
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 03.12.25 18:17
Оценка:
Здравствуйте, Skorodum, Вы писали:

M>>Порядок разный, да. Но не условный. Хидер, в котором объявлен макрос, защищён только #pragma once. Он может где-то ещё включаться, но точно включается в том файле, где происходила ошибка

S>Недавно столкнулся с проблемой, когда #pragma once не работала в расшаренной папке на виртуальной машине.

Ну, тут она таки работает, иначе были бы сообщения об уже объявленных макросах
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.