是否可以将结构体成员名称作为函数 [C] 中的参数传递?

问题描述 投票:0回答:1

我正在编写启发式方法来解决网格问题,但最终我在函数体中重复了相同的代码块 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”,这在这种情况下确实会减少代码大小。

c performance optimization arguments inline
1个回答
0
投票

有任何方法可以实现预期目标,一种方法是使用结构内成员的偏移量。偏移量可以从

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
© www.soinside.com 2019 - 2024. All rights reserved.