我正在编写启发式方法来解决网格问题,但最终我在函数体中重复了相同的代码块 4 次,每次都有非常小的差异,因此建议我编写一个内联函数以使其看起来更好。
我的网格是一个具有成员大小的结构,线条由另一个结构表示:
typedef struct
{
int size;
binline *lines;
} grid_t;
和
typedef struct
{
uint64_t ones;
uint64_t zeros;
} gridline;
一个(或零)是一个二进制整数,其位代表网格中一个(或零)的位置。
所以我现在拥有的是一个函数,其条目看起来像
static inline bool subheuristic(grid_t *grid, ..., ..., char c)
在正文中,我测试“c”是 1 还是 0,然后应用相应的启发式。
问题是它并没有真正减少代码大小...... 我想知道是否可以将“some”作为参数,然后在主体中立即使用它来访问例如
grid->gridline.some
,在这种情况下,这确实会减少代码大小。
有任何方法可以实现预期目标,一种方法是使用结构内成员的偏移量。偏移量可以从
offsetof
中定义的标准 stddef.h
宏获得。
#include <stddef.h>
uint64_t get_grid_bits(const gridline *gl, size_t offset) {
return *(uint64_t*)( (char*)gl + offset );
}
...
gridline gl = { .ones = 13, .zeros = 42 };
get_grid_bits(&gl, offsetof(gridline, ones)); // return 13
get_grid_bits(&gl, offsetof(gridline, zeros)); // return 42
工作就像一个魅力。