__COUNTER__ в имени переменной

Я видел этот вопрос:

Как генерировать случайные имена переменных в C ++ с помощью макросов?

со следующим ответом: https://stackoverflow.com/a/1675203/551045

И я попытался реализовать это в Clang.

Вот моя декларация:

#define TRACE(stream) FuncTrace x#__COUNTER__ (llvm::errs(), "hallo", 1)

Я перепробовал все варианты x##__COUNTER__; x ## __COUNTER__ и так далее, но, похоже, никто не работает.

Может ли это быть лягушатник? Лязг Помогите Страница говорит, что имеет __COUNTER__ макро.

В конце макроса мне нужно что-то вроде этого:

#define TRACE(stream) FuncTrace x#__COUNTER__ (stream, __FUNCTION__, __LINE__)

1

Решение

  1. Чтобы объединить два токена в один, вы используете ## оператор. # Оператор используется для превращения токена в строку.

  2. x ## __COUNTER__ будет просто производить x__COUNTER__, Вам нужно полностью расширить __COUNTER__ первый. Одним из возможных способов является добавление еще нескольких косвенных указаний, например,

    #define YTRACE(x, y) FuncTrace x##y (llvm::errs(), __FUNCTION__, __LINE__)
    #define XTRACE(x, y) YTRACE(x, y)
    #define TRACE(x) XTRACE(x, __COUNTER__)
    
6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector