Restlet звучит так, как будто он должен обеспечить то, что вы ищете:
Проблема в том, что при замене макроса препроцессор будет только расширять макросы. рекурсивно, если к нему не применены ни оператор преобразования строки #
, ни оператор вставки токена ##
. Итак, вы должны использовать несколько дополнительных уровней косвенного обращения, вы можете использовать оператор вставки токена с рекурсивно расширенным аргументом:
#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.