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 не работала в расшаренной папке на виртуальной машине.

Ну, тут она таки работает, иначе были бы сообщения об уже объявленных макросах
Маньяк Робокряк колесит по городу
Re: MSVC2022/2026 не видит макрос, вернее, пытается его как-то трактовать...
От: _NN_  
Дата: 13.12.25 16:26
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здраыствуйте!


M>MSVC не видит макрос, причем у 2026 таких случаев сильно больше, но суть одна. Или даже похоже, что оно пытается до раскрытия макросов какие-то выводы делать.

M>Предыдущие студии нормально компилируют, GCC, вплоть до 15го, также нормально все компилирует.

А какой режим препроцессора используется ?
Может в старых компиляторах не был включён новый режим.
https://learn.microsoft.com/en-us/cpp/build/reference/zc-preprocessor?view=msvc-170

С C++20 это по умолчанию включается.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.