У меня есть следующий код.
#define GOTO_RC(row,col) "\033["#row";"#col"H"
#define DISPLAY_WRITE(row, col, fmt, args) printf(GOTO_RC(row,col) ## fmt, ## args)
В example.c я пытаюсь его использовать.
DISPLAY_WRITE(24,1,"Command:",12);
Я получаю следующую ошибку в инструменте ARM-MDK [введите описание изображения здесь] [1] [1]: Ошибка https://i.stack.imgur.com/33MN1.jpg: вставка сформирована ') "Команда:"', недопустимый токен предварительной обработки [-Winvalid-token-paste] ошибка: вставка сформированного ', 12', недопустимый токен предварительной обработки [-Winvalid-token-paste]
Поскольку вы просто хотите объединить две строки, избавьтесь от ##
в DISPLAY_WRITE
. Два строковых литерала рядом друг с другом автоматически объединяются. ##
предназначен для объединения двух токенов вместе и последующей их интерпретации как токена, а не строкового литерала.
Кроме того, это не совсем так, но если вы хотите иметь возможность принимать несколько «аргументов», вам понадобится поддержка макросов с переменным числом аргументов (их поддерживает большинство соответствующих вещей), и сделайте что-то вроде этого:
#define DISPLAY_WRITE(row, col, fmt, ...) printf(GOTO_RC(row,col) fmt, __VA_ARGS__)
Спасибо за ответ. Как я могу поступить, если у меня нет аргументов для печати. как DISPLAY_WRITE (1,2, «Ошибка»). Я хочу, чтобы раздел аргументов оставался необязательным. Я попробовал #define DISPLAY_WRITE (row, col, fmt, ...) printf (GOTO_RC (row, col) fmt VA_OPT __ (,) __VA_ARGS). хотя я получаю ожидаемую ошибку '('. Я пытаюсь понять, что происходит.
Я отработал. #define DISPLAY_WRITE (строка, столбец, fmt, ...) printf (GOTO_RC (row, col) fmt, ## __ VA_ARGS__). Приветствую за вашу помощь.
Спасибо за ответ.