Неправильно прерванный вызов макроса при использовании # перед текстом замены - PullRequest
0 голосов
/ 09 июня 2019

Я новичок в C, поэтому этот вопрос может быть глупым.Тем не менее, я пытался поэкспериментировать с макросом.

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

В VS2019 следующий код выдает ошибку, сообщающую о некорректно завершенном вызове макроса.Почему это?

#include <stdio.h>

#define toStr(x) #x

main(){
    printf(toStr(the "\" is the escape character));
}

1 Ответ

2 голосов
/ 09 июня 2019

Как отметил @alinsoar в своем комментарии, текстовая строка написана неправильно. Экранирующий символ '\' экранирует текст, следующий в соответствии с правилами. В результате, когда у вас есть "\", вы указали, что кавычка после обратной косой черты экранируется, что приводит к тому, что текстовая строка не имеет завершающей кавычки. См. Как распечатать косую черту (/ или \) в C?

Чтобы фактически напечатать escape-символ, вам нужно экранировать его, как в "\\", что приведет к печати одного escape-символа, и текстовая строка также будет правильно закрыта завершающей кавычкой.

См. Препроцессор C, Stringify результат макроса , который предоставляет информацию об операторе Stringify препроцессора C, что и делает # для расширения макроса.

Вы должны рассмотреть различные правила для escape-символа и его использования в C. Этот список для C ++ почти такой же, как и для C. https://en.cppreference.com/w/cpp/language/escape

См. Также Объяснить обратную косую черту в C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...