gpt4 book ai didi

任何人都可以推荐一种方法来编写计算结构中字段数量的函数吗?即 - 伪代码 - 'for field in struct'

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

我想要一个可以向其传递结构的 C 函数,它将返回结构内的字段/成员的数量。

目前,我发现最简单的方法是制作一个表,并在我向任何程序添加结构时添加到表中。

我想我遇到了 XY 问题(根据建议)所以无论如何,我使用这种类型函数的原因是因为我想通过套接字发送结构并避免整个序列化过程我尝试执行此操作的方法是向结构的字段成员添加分隔符。像这样:

0x001 --> hdrdata --> 0x003 --> hdrdata --> 0x017 --> 0x002 --> bodydata --> 0x003 --> bodydata --> 0x003 --> bodydata --> 0x004

p>

正如你所看到的,可能有 1 个正文数据,也可能有 10 个正文数据等。我能很快想到要做的唯一另一件事就是向我的结构添加一个成员,该成员将通知我的 header 将传输多少“正文数据”通过,以便客户端知道需要多少个 0x003。

或者(我不是在要求答案,但如果你愿意的话,请随意)有人可以推荐一个更好的协议(protocol)设计来在unix中通过套接字发送结构吗?这个项目的大部分内容都是为了我自己的学习,所以我对使用已经完整的库/包解决方案不感兴趣,否则我首先会用另一种语言编写它。

最佳答案

这非常非常难看,但我唯一能想到的是 X-Macro:

#include <stdio.h>

#define MEMBERS \
X(char a) \
X(float b) \
X(double c)

struct T {
#define X(x) x;
MEMBERS
#undef X
};

int main(void)
{
size_t n = 0
#define X(x) +1
MEMBERS
#undef X
;

printf("%zu members\n", n);
return 0;
}

这扩展为:

#include <stdio.h>

struct T {
char a;
float b;
double c;
};

int main(void)
{
size_t n = 0+1+1+1;

printf("%zu members\n", n);
return 0;
}

正如 @HAL9000 在评论中指出的,您可以通过以下方式同时生成两者(struct 和计数器):

#include <stdio.h>

#define GENERATE_STRUCT(s) s;
#define GENERATE_SCOUNT(s) +1

#define set_struct(name) \
struct name { \
name##_members(GENERATE_STRUCT) \
}; \
\
size_t name##_count(void) \
{ \
return 0 \
name##_members(GENERATE_SCOUNT) \
; \
}

#define foo_members(X) \
X(char a) \
X(float b) \
X(double c)

set_struct(foo)

int main(void)
{
printf("%zu members\n", foo_count());
return 0;
}

在本例中扩展为:

#include <stdio.h>

struct foo {
char a;
float b;
double c;
};

size_t foo_count(void)
{
return 0+1+1+1;
}

int main(void)
{
printf("%zu members\n", foo_count());
return 0;
}

最后,@Lundin 提供了另一个使用 enum 而不是变量的实现:

#include <stdio.h>

#define MEMBERS \
/* type name */ \
X(char, a) \
X(float, b) \
X(double, c) \

struct T {
#define X(type, name) type name;
MEMBERS
#undef X
};

enum
{
#define X(type, name) dummy_##name,
MEMBERS
#undef X
MEMBER_COUNT
};

int main(void)
{
printf("%d members\n", MEMBER_COUNT);
return 0;
}

扩展为:

#include <stdio.h>

struct T {
char a;
float b;
double c;
};

enum {
dummy_a,
dummy_b,
dummy_c,
MEMBER_COUNT
};

int main(void)
{
printf("%d members\n", MEMBER_COUNT);
return 0;
}

关于任何人都可以推荐一种方法来编写计算结构中字段数量的函数吗?即 - 伪代码 - 'for field in struct',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56227634/

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