【发布时间】:2015-04-30 12:03:52
【问题描述】:
标题可能不清楚,我举个例子吧。
我正在尝试用 C 语言创建一个“数据流”系统。
输入STREAM:
typedef struct {
void (*tx) (uint8_t b);
uint8_t (*rx) (void);
} STREAM;
我有一个文件 uart.h 和 uart.c,它应该为 UART 提供一个 STREAM。
我决定最好将它作为一个指针公开,这样它就可以在不使用 & 符号的情况下传递给函数。
这是我想使用的功能类型(示例):
/** Send signed int */
void put_i16(const STREAM *p, const int16_t num);
这是我的 UART 文件:
uart.h
extern STREAM* uart;
uart.c
// Shared stream instance
static STREAM _uart_singleton;
STREAM* uart;
void uart_init(uint16_t ubrr) {
// uart init code here
// Create the stream
_uart_singleton.tx = &uart_tx; // function pointers
_uart_singleton.rx = &uart_rx;
uart = &_uart_singleton; // expose a pointer to it
}
对此我不确定。它有效,但它是正确的方法吗?我应该改用 Malloc 吗?
为什么我问这个,这是一个库代码,我希望它尽可能干净和“正确”
【问题讨论】:
-
无需使用
malloc。你的代码在我看来很好。 -
所以以这种方式使用堆变量可以吗?只是确保,我对这个更高级的 C 不是很有经验
-
你的代码中没有堆变量,只有全局变量。
-
哦,我以为
_uart_singleton存在于堆中。无论如何,这就是我的意思 -
谷歌
data vs bss了解更多信息。