Как найти, если функция статична во время компиляции - PullRequest
2 голосов
/ 12 мая 2011

У меня есть макрос регистрации, который регистрирует указатель this функции, но проблема заключается в том, что при записи макроса, используемого в статической функции, у которой нет этого указателя, я получаю ошибку компиляции.

например,

LOG_DEBUG(msg,...) \
   Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, this, msg, ## __VA_ARGS__);

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

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

Ответы [ 2 ]

3 голосов
/ 12 мая 2011

Я бы избегал попыток автоматического обнаружения и возложил бы на себя ответственность разработчика.
Просто предоставьте еще один макрос регистрации для ситуаций, когда это значение отсутствует.
Компилятор выдаст ошибку, если вы неправильно используете LOG_DEBUG () и сможете заменить.

LOG_NON_OO_DEBUG(msg,...) \
   Log::WriteLog(Log::LOG_DEBUG, __FILE__, __LINE__, _FUNC_NAME_, msg, ## __VA_ARGS__);

Примечание: я бы не пропустил NULL (или 0).
Я бы перегружал метод WriteLog (), чтобы у него была версия, для которой не требуется указатель this.

1 голос
/ 12 мая 2011

В дополнение к ответу Мартина, 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, и, как предположил Мартин, ответственность за то, чтобы передать это или нет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...