Как хеш оценивается препроцессором gcc? - PullRequest
0 голосов
/ 04 мая 2011

Какова цель этого блока в stdint.h (из newlib)?

#if defined(__GNUC__) && \
  ( (__GNUC__ >= 4) || \
    ( (__GNUC__ >= 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ > 2) ) )
/* gcc > 3.2 implicitly defines the values we are interested */
#define __STDINT_EXP(x) __##x##__

Этот макрос используется позже в заголовке для сравнения целых чисел, но я не уверен, как его оценивать. Например:

#if __STDINT_EXP(LONG_MAX) > 0x7fffffff

Ответы [ 3 ]

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

## - оператор cpp (препроцессор C) для объединения токенов, т. Е.

#if __STDIN_EXP(LONG_MAX) > 0x7fffffff

оценивается как

#if __LONG_MAX__ > 0x7fffffff

на первом шаге.

2 голосов
/ 04 мая 2011

Оператор ## означает «сцепление» с препроцессором C, поэтому эта строка эквивалентна:

#if __LONG_MAX__ > 0x7fffffff

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

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

В препроцессоре ## объединяет два фрагмента текста в один большой токен.Этот конкретный макрос ударяет подчеркивание на каждой стороне идентификатора, поэтому, если вы используете gcc 3.2 или более позднюю версию, это:

#if __STDINT_EXP(LONG_MAX) > 0x7fffffff

Превращается в следующее:

#if __LONG_MAX__ > 0x7fffffff
...