gpt4 book ai didi

c - 在普通 C 中应用鸭子类型(duck typing)

转载 作者:太空狗 更新时间:2023-10-29 17:03:43 25 4
gpt4 key购买 nike

my open-source plain C code我使用这个简单的结构从字符串缓冲区读取和解析数据:

typedef struct lts_LoadState
{
const unsigned char * pos;
size_t unread;
} lts_LoadState;

使用 this simple API 访问缓冲区:

/* Initialize buffer */
void ltsLS_init(lts_LoadState * ls,const unsigned char * data, size_t len);

/* Do we have something to read? (Actually a macro.) */
BOOL ltsLS_good(ls);

/* How much do we have to read? (Actually a macro.) */
size_t ltsLS_unread(ls);

/* Eat given number of characters, return pointer to beginning of eaten data */
const unsigned char * ltsLS_eat(lts_LoadState * ls, size_t len);

注意:ltsLS_unread 可以替换为 return (ltsLS_good(ls)) ? SIZE_MAX:0 不会破坏当前的实现。

此代码用于load some data in a custom format from a string buffer . (This 可能是一个更好的例子。)


现在我需要不是从字符串缓冲区加载数据,而是从FILE 指针加载数据。

我不想复制粘贴实现,而是想重用现有代码。 (当然,我可以重构/调整它。)

这是 C++ 教科书中的内容,但是如何在不产生运行时开销的情况下在普通 C 中做到这一点?


这是一个使用 lts_LoadState API 的示例函数,不能复制粘贴(但当然可以更改以支持字符串缓冲区和 FILE *):

static int ltsLS_readline(
lts_LoadState * ls,
const unsigned char ** dest,
size_t * len
)
{
const unsigned char * origin = ls->pos;
unsigned char last = 0;
size_t read = 0;

while (ltsLS_good(ls))
{
if (ltsLS_unread(ls) > 0)
{
unsigned char b = *ls->pos; /* OK, this should be ltsLS_eat_char macro. */
++ls->pos;
--ls->unread;

if (b == '\n')
{
*dest = origin;
*len = (last == '\r') ? read - 1 : read;

return LUATEXTS_ESUCCESS;
}

last = b;
++read;
}
else
{
ls->unread = 0;
ls->pos = NULL;
}
}

return LUATEXTS_ECLIPPED;
}

最佳答案

听起来您想要函数变量,您可以将其作为参数传递。 C 可以做到,但语法不是很漂亮。

可能会有一些运行时开销,但不会太多。

How do you pass a function as a parameter in C?

关于c - 在普通 C 中应用鸭子类型(duck typing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10001570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com