Я работаю с 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.