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

标签 c for-loop struct introspection

我想要一个可以向其传递结构的 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/

相关文章:

在 MIFARE DESFire EV1 卡上创建应用程序

powershell - Get-ChildItem零结果输出

matlab - 用于图像处理的非线性滤波器 - 在掩码内寻找最小值

Python:如何使用结构来打包和解包对对象的引用?

c - 访问 C 中动态分配的嵌套结构

c - 在文件复制的上下文中字符缓冲区的用途是什么? [C]

c - &= 是什么意思?

c - LPCXpresso错误CreateProcess:没有这样的文件或目录

java - 在 Java 中访问嵌套列表数组时遇到问题

c - 如何在C中复制函数内的结构?内存复制