首页 > 解决方案 > avr-libc 和 stdio.h - 类似函数的宏导致错误:“do”之前的预期 unqualified-id

问题描述

我正在使用 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 中。

标签: c++macrossyntax-erroravrpreprocessor

解决方案


推荐阅读