Может ли параметр макроса перейти в переменную массива char? - PullRequest
1 голос
/ 15 февраля 2020

В приведенном ниже коде есть ошибка компиляции: команда препроцессора должна начинаться с первого не белого пространства

#define Assert(expr, format, ...)                               \
if(!(!!(expr)))                                                 \
{                                                               \   
char message[4096] = #format;                                   \
}

Пожалуйста, помогите мне. Я хочу, чтобы строка была передана в 'format'.

1 Ответ

1 голос
/ 15 февраля 2020

За мои деньги, либо что-то не так перед этим кодом, либо есть пробелы после обратного слэса sh, либо есть другая неочевидная проблема. Когда я выбираю макрос в браузере, после третьего обратного знака sh появляются три пробела. Они формально завершают макрос Assert и оставляют # на следующей строке, чтобы вызвать ошибку. (Вне определения макроса символ # не имеет никакого значения в C ++, кроме как для запуска директивы препроцессора.)

Я добавил канал в конце каждой строки.

#define Assert(expr, format, ...)                               \|
if(!(!!(expr)))                                                 \|
{                                                               \   |
char message[4096] = #format;                                   \|
}|

Удалите эти пробелы и посмотрите на ошибку vani sh. Не допускайте в своем коде конечных пробелов.

Когда я помещаю код, скопированный из вопроса, в файл pp71.cpp и пытаюсь скомпилировать его в объектный файл (который будет пустым), я получаю:

$ g++ -O3 -g -std=c++11 -Wall -Wextra -Werror -c pp71.cpp
pp71.cpp:3:65: error: backslash and newline separated by space [-Werror]
    3 | {                                                               \
      |                                                                  
cc1plus: all warnings being treated as errors
$

Это из G CC 9.2.0 на MacBook Pro с MacOS Catalina 10.15.3.

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