Я видел этот вопрос:
Как генерировать случайные имена переменных в 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__)
Чтобы объединить два токена в один, вы используете ##
оператор. #
Оператор используется для превращения токена в строку.
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__)
Других решений пока нет …