Создание C макрос с ## и __ СТРОКА __ (маркерная конкатенация с расположением макроса)

Restlet звучит так, как будто он должен обеспечить то, что вы ищете:

  • Поддержка клиента и сервера (в относительно симметричном API)
  • Smart привязка url
  • понимание типов MIME (учитывая принятые типы MIME, оно запросит у ваших ресурсов их представление в этом типе)
  • Поддерживает аннотации JAX-RS (как в Джерси)

101
задан animuson 6 July 2013 в 06:31
поделиться

1 ответ

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

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void) {}

Затем, __ LINE __ расширяется до номера строки во время раскрытия UNIQUE (поскольку он не связан ни с # , ни с ## ), и тогда вставка токена происходит во время раскрытия TOKENPASTE .

Следует также отметить, что существует также макрос __ COUNTER __ , который расширяется до нового целого числа каждый раз при вычислении на случай, если вам нужно иметь несколько экземпляров макроса UNIQUE в одной строке. Примечание: __ COUNTER __ поддерживается MS Visual Studio, GCC (начиная с V4.3) и Clang, но не является стандартным C.

а затем вставка токена происходит во время раскрытия TOKENPASTE .

Также следует отметить, что существует также макрос __ COUNTER __ , который каждый раз заменяется новым целым числом. оценивается, если вам нужно иметь несколько экземпляров макроса UNIQUE в одной строке. Примечание: __ COUNTER __ поддерживается MS Visual Studio, GCC (начиная с V4.3) и Clang, но не является стандартным C.

а затем вставка токена происходит во время раскрытия TOKENPASTE .

Также следует отметить, что существует также макрос __ COUNTER __ , который каждый раз заменяется новым целым числом. оценивается, если вам нужно иметь несколько экземпляров макроса UNIQUE в одной строке. Примечание: __ COUNTER __ поддерживается MS Visual Studio, GCC (начиная с V4.3) и Clang, но не является стандартным C.

168
ответ дан 24 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: