C / C ++ классные определения макросов? - PullRequest
5 голосов
/ 06 февраля 2010

Помимо __LINE__ и __FILE__, существуют ли другие полезные предопределенные макросы, такие как __FUNCTION_NAME__?

Если нет, но вы знаете о других классных / полезных определенных макросах (особенно в целях отладки), я хотел бы услышать о них.

Некоторые спрашивали о платформе: я использую gcc / g ++ на MacOSX.

Ответы [ 7 ]

7 голосов
/ 06 февраля 2010

Я могу найти следующее (описания из черновика C99, но я думаю, что они доступны и в C89):

  • __DATE__: дата перевода единицы обработки предварительной обработки: символ строковый литерал вида "Mmm dd yyyy", где имена месяцы такие же, как те, которые генерируются функцией asctime, и первый символ dd является пробелом, если значение меньше 10. Если дата перевода недоступна, определенная реализацией действительная дата должны быть поставлены.
  • __TIME__: время перевода единицы обработки предварительной обработки: символ строковый литерал вида "чч: мм: сс", как во времени, генерируемом asctime функция. Если время перевода недоступно, Должно быть предоставлено действительное время, определенное реализацией.

Для текущего имени функции C99 определяет __func__, но __FUNCTION_NAME__ не является стандартным макросом. Кроме того, __func__ - это не макрос, это зарезервированный идентификатор (6.4.2.2p1):

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

static const char __func__[] = "* * имя функция 1023 ";

Появилось

, где имя-функции - это название лексической функции.

Если вы ищете что-то специфичное для платформы: вот список стандартных предопределенных макросов gcc . Мне нравится __COUNTER__, которое представляет собой уникальное последовательное целое число, начинающееся с 0. Я думаю, что __INCLUDE_LEVEL__ тоже круто, но не уверен, смогу ли я подумать о его использовании: -).

3 голосов
/ 06 февраля 2010

Общие GCC макросы.

2 голосов
/ 06 февраля 2010

Конкретный, который вы ищете, называется __func__, но это не совсем макрос, поскольку его значение меняется в зависимости от того, где он виден. Это полезно, однако, и похоже на макрос.

Мой любимый макрос на данный момент - __STDC_VERSION__, потому что он позволяет мне делать это:

#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
# define inline
# define register
# if __GNUC__ >= 2 || _MSC_VER >= 1300
#  define __func__ __FUNCTION__
# else
#  define __func__ "<unknown>"
# endif
#endif

Теперь вы можете использовать ключевые слова C99 inline, register и __func__, чтобы объявлять вещи, не беспокоясь о том, поддерживает ли используемый вами компилятор эту функциональность C99! В действительности, бит для inline является более сложным, поскольку некоторые компиляторы определяют __inline и другие подобные глупости, но вы получите общее представление.

Кроме того, полезный список предопределенных макросов для идентификации компиляторов, операционных систем и архитектур можно найти здесь .

2 голосов
/ 06 февраля 2010

На этой странице MSDN представлен полный набор предопределенных макросов для MSVC .

Лично я думаю, __COUNTER__ довольно круто.

1 голос
/ 06 февраля 2010

Если я не ошибаюсь, __func__ - это не макрос. Это в основном имя, которое объявлено как static const char * const __func__ = "function_name"; в начале любой функции, в которой оно используется. И вы должны использовать __func__ вместо чего-то вроде __FUNCTION_NAME__, потому что __func__ является частью стандарта C99.

0 голосов
/ 13 августа 2014

Я склонен создавать однострочные условия вроде.

#define ZZ_Slash_for_commenting_out /
#ifdef _DEBUG
#define D_B_O std::cerr
#else
#define D_B_O ZZ_Slash_for_commenting_out/
#endif
    D_B_O << "Your thing here" << endl;
0 голосов
/ 06 февраля 2010

Вы можете получить все стандартные предопределенные макросы из gcc следующим образом:

$ gcc -dM -E - < /dev/null

Конечно, это не включает специальные макросы, такие как:

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