gpt4 book ai didi

c - API 结构实用程序 - 函数还是宏?

转载 作者:行者123 更新时间:2023-11-30 14:25:31 25 4
gpt4 key购买 nike

我在库 API 中定义了一个实用程序结构,它有四个字段,都是数字计数器。

typedef struct {
size_t bytes;
int codepoints;
int graphemes;
int columns;
} TickitStringPos;

我想提供一些实用程序来轻松处理这些结构。我可以将它们实现为(静态内联)函数,例如

static inline void tickit_stringpos_zero(TickitStringPos *pos) {
pos->bytes = pos->codepoints = pos->graphemes = pos->columns = 0;
}

static inline void tickit_stringpos_limit_columns(TickitStringPos *pos, int columns) {
pos->bytes = pos->codepoints = pos->graphemes = -1;
pos->columns = columns;
}

TickitStringPos here, limit;
tickit_stringpos_zero(&here);
tickit_stringpos_limit_columns(&limit, 20);

或者我可以将它们实现为宏,例如

#define TICKIT_STRINGPOS_ZERO(pos) do { \
(pos).bytes = (pos).codepoints = (pos).graphemes = (pos).columns = 0; \
} while(0);

#define TICKIT_STRINGPOS_LIMIT_COLUMNS(pos,_columns) do { \
(pos).bytes = (pos).codepoints = (pos).graphemes = -1; \
(pos).columns = _columns; \
} while(0);

TickitStringPos here, limit;
TICKIT_STRINGPOS_ZERO(here);
TICKIT_STRINGPOS_LIMIT_COLUMNS(limit, 20);

我应该考虑如何权衡这两种方法?每种方法都可能同样强大且灵活,但由于某种原因是否有一种方法特别优选?

最佳答案

优先选择函数而不是宏,原因很简单,与宏不同,它们为您提供类型安全性。
此外,与宏不同,使用函数您不必担心任何副作用。

至于函数内联,它只是向编译器表明您的愿望,它不会约束编译器使函数内联,但是任何现代的函数编译器将轻松完成所需的工作。

关于c - API 结构实用程序 - 函数还是宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232645/

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