Самым простым трюком было бы объявить фиктивный класс на верхнем уровне с экземпляром указателя с именем "this".
Ваш макрос всегда будет видеть "this" и может решить не печатать, потому что this == & dummy.
Недостатком является то, что "this" является зарезервированным словом, и, вероятно, предупреждения компилятора, ошибки и разработчики стандартов не будут вашим другом. Вам это может сойти с рук, потому что компиляторы пытаются поддерживать обратную поддержку, а неклассовые методы не / не нуждаются / не резервируют "this".
Другой вариант - глобальный символ со сложным именем, и макрос, который объявляет то же комплексное имя, что и член класса, который вы добавляете во все классы, которые вы хотите отследить. Затем ваш макрос будет видеть экземпляр члена класса при компиляции в функции-члене класса, в котором вы объявили свой дополнительный символ, но видеть глобальный при компиляции в функции, не являющейся членом.
Самый дешевый символ для объявления будет перечислением, так как они являются просто константами, но тогда как вы будете различать guish между глобальным и классовым вариантами, когда существует много вариантов классов? Конечно, вы можете использовать имя typeid в качестве синонима для содержащего класса.
Это мои идеи о том, чего они стоят.
Следующая самая дешевая - это, вероятно, встроенная функция-член, возможно, также встроенная функция-член c и глобальная функция, которая может вернуть ваш уникальный идентификатор (их указатель this и, возможно, также объект typeid). .
Гораздо более простым решением являются разные именованные версии макроса журнала, который вы используете в разных контекстах. Компилятор «поможет» вам, когда вы используете неправильный.