В дополнение к ответу Мартина, this является конструкцией времени компиляции, тогда как макросы являются препроцессорами, поэтому нет способа проверить наличие this с помощью макроса. В менее строго типизированных языках, таких как perl, вы можете проверить, определен ли символ, но поскольку C / C ++ строго типизированы, такой оператор не нужен.
редактировать
Я хочу немного пояснить мысль, которую я пытался изложить в предыдущем абзаце.
Препроцессор - это Cism. Если бы мне пришлось делать ставку, он, вероятно, видел только исправления ошибок и незначительные изменения в своем поведении, но в остальном он почти идентичен по поведению с C 20 лет назад. Другими словами, препроцессор не предназначен для работы с языковыми функциями.
Функции языка, такие как static , this , соглашения о вызовах, типы и т. Д. Препроцессор не знает о них и не имеет логики для работы с ними. Единственный способ сделать это можно, если существует языковая функция для проверки определенности this , или для проверки наличия статической функции или нет.
/ редактировать
Я склонен предложить вам использовать немарокловый подход к ведению журнала или менее макро-зависимое решение. Единственное преимущество, которое я вижу в использовании макросов, это то, что вам не нужно вводить __FILE__
и __LINE__
повсюду. В этом отношении я не вижу проблемы с упаковкой того, что вы придумали в макросе.
Например, вы можете добавить универсальную функцию к вашим классам, которая генерирует краткую информацию, например:
class MyClass {
private:
void MemberLogMsg();
public:
static void LogMsg( MyClass* M = NULL);
};
Ваш макрос всегда будет вызывать LogMsg, и, как предположил Мартин, ответственность за то, чтобы передать это или нет.
Теперь я не буду придерживаться качества приведенного выше примера, только духом того, что он должен выразить.