c++ - 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++ - 在 Windows 上将不带 pkg-config 的 gtkmm 3.0 与 CMake 链接
- jquery - jquery选择ID以开头的最近的div
- c++ - c ++聚合初始化,引擎盖下是什么?
- java - 如何修复 OptaPlanner 中的构造启发式?
- javascript - 组件有渲染方法,但没有扩展 React.Component
- flutter - 无法象征原生 Android Flutter 崩溃
- amazon-web-services - 对 aws quicksight 中的画面等所有视觉对象应用过滤器?
- c# - Tls 1.2 或 Tls 1.0 与 .net 框架 4.0
- elasticsearch - 当前令牌(START_OBJECT)不是布尔类型 - 弹性搜索批量插入
- java - Junit 测试用例 AssertionError 应为 json 字符串