Ошибка: вставка сформирована с недопустимым токеном предварительной обработки

У меня есть следующий код.

#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]

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 503
1

Ответы 1

Поскольку вы просто хотите объединить две строки, избавьтесь от ## в DISPLAY_WRITE. Два строковых литерала рядом друг с другом автоматически объединяются. ## предназначен для объединения двух токенов вместе и последующей их интерпретации как токена, а не строкового литерала.

Кроме того, это не совсем так, но если вы хотите иметь возможность принимать несколько «аргументов», вам понадобится поддержка макросов с переменным числом аргументов (их поддерживает большинство соответствующих вещей), и сделайте что-то вроде этого:

#define DISPLAY_WRITE(row, col, fmt, ...) printf(GOTO_RC(row,col) fmt, __VA_ARGS__)

Спасибо за ответ.

user1598715 02.05.2018 14:00

Спасибо за ответ. Как я могу поступить, если у меня нет аргументов для печати. как DISPLAY_WRITE (1,2, «Ошибка»). Я хочу, чтобы раздел аргументов оставался необязательным. Я попробовал #define DISPLAY_WRITE (row, col, fmt, ...) printf (GOTO_RC (row, col) fmt VA_OPT __ (,) __VA_ARGS). хотя я получаю ожидаемую ошибку '('. Я пытаюсь понять, что происходит.

user1598715 02.05.2018 14:06

Я отработал. #define DISPLAY_WRITE (строка, столбец, fmt, ...) printf (GOTO_RC (row, col) fmt, ## __ VA_ARGS__). Приветствую за вашу помощь.

user1598715 02.05.2018 14:15

Другие вопросы по теме