avr-libc и stdio.h - функционально-подобный макрос приводит к ошибке: ожидаемый неквалифицированный идентификатор перед «do» - PullRequest
0 голосов
/ 13 июня 2019

Я работаю с avr-libc, и мне нужно использовать функциональный макрос, определенный в заголовке stdio.h библиотеки:

#define fdev_setup_stream(stream, p, g, f) \
do { \
(stream)->put = p; \
(stream)->get = g; \
(stream)->flags = f; \
(stream)->udata = 0; \
} while(0)

в своем коде я создаю буфер FILE и пытаюсь подготовить его с помощью макроса:

void uart_putchar(char c, FILE *stream) {
    if (c == '\n') {
        uart_putchar('\r', stream);
    }
    loop_until_bit_is_set(UCSR0A, UDRE0);
    UDR0 = c;
}

FILE uart_output;
fdev_setup_stream(uart_output, uart_putchar, NULL, _FDEV_SETUP_WRITE);

При компиляции я получаю следующую ошибку:

<path_to_file>/foo.cpp:80:1: error: expected unqualified-id before 'do'
fdev_setup_stream(uart_output, uart_putchar, NULL, _FDEV_SETUP_WRITE);
^
<path_to_file>/foo.cpp:80:1: error: expected unqualified-id before 'while'
fdev_setup_stream(uart_output, uart_putchar, NULL, _FDEV_SETUP_WRITE);
^

Почему компилятор не разрешает определение макроса? Почему синтаксис не будет правильным?

Я компилирую с avr-g ++ версии 4.9.2 и использую флаг -std = gnu ++ 11. В Ubuntu 16.04.

...