【问题标题】:Automatic generation of struct printing function in CC语言自动生成struct打印函数
【发布时间】:2023-02-10 06:00:34
【问题描述】:

我有很多程序都定义了structs。每次,我都必须创建一个函数来打印成员。例如,

typedef struct {
    char name[128];
    char address[1024];
    int zip;
   } myStruct;


void printMyStruct(myStruct myPeople) {

  printf("%s\n",myPeople.name);
  printf("%s\n",myPeople.address);
  printf("%d\n",myPeople.zip);
}

int main()
{
   myStruct myPeople={"myName" , "10 myStreet", 11111};

   printMyStruct(myPeople);
}

我知道 C 中不支持反射。因此,我为我定义的每个结构编写了这些打印函数。
但是,我想知道是否有任何技巧可以自动生成这些打印功能。我会明白我必须稍微修改这些功能。但是,如果部分工作是自动完成的,那就太好了。 (这个例子很简单,有时结构是嵌套的或者我有结构数组或者一些字段是指针,......)

【问题讨论】:

  • 询问是否存在程序或其他外部资源/在哪里可以找到它在这里显然是题外话。
  • @伦丁。那么我在哪里可以问这个问题呢?
  • 如果您对其进行编辑,使其仅与如何使用宏生成此内容有关,那么它将在这里成为主题。否则,如果您正在寻找预制程序,请尝试softwarerecs.stackexchange.com
  • @伦丁。我做到了。现在可以了吗?
  • 是的,我想是的。我将投重新公开的一票。

标签: c reflection


【解决方案1】:

您当然可以打印结构,但期望有很多不可读的输出:

#include <stdio.h>
#include <ctype.h>

struct example {
     int x;
     int y;
     char c;
};

#define NOT_PRINTABLE "Not Printable"

void print_structure(const char *structure, size_t size) {
     for (size_t i = 0; i < size; i++) {
          printf("%ld)	%.2X: %.*s
", i, structure[i], 
                (isprint(structure[i]) ? 1 : sizeof(NOT_PRINTABLE) - 1),
                (isprint(structure[i]) ? &structure[i] : NOT_PRINTABLE));
     }
}

int main(int argc, char **argv) {
     struct example a;
     a.x = 5;
     a.y = 6;
     a.c = 'A';
     print_structure((char *)&a, sizeof(struct example));

     return 0;
}

但问题是,它将打印内存中表示的结构。所以 4 字节(32 位)整数 1 将用 4 个字节表示,而不是字符“1”。

由于指针的工作方式,您无法确定成员是指针还是非指针。

另一个问题是结构具有填充以帮助对齐和更好/有效地使用内存。所以你会在中间看到很多 0x00。

记住C是一种编译语言。

【讨论】:

    【解决方案2】:

    让我们考虑使用https://copilot.github.com/。这很棒。 这就是我和副驾驶的关系

    typedef struct {
        char name[128];
        char address[1024];
        int zip;
       } myStruct;
    
    //print struct myStruct  >> auto generate by codepilot after you type a comment `print struct myStruct`
    void printStruct(myStruct *s) {
        printf("name: %s
    ", s->name);
        printf("address: %s
    ", s->address);
        printf("zip: %d
    ", s->zip);
    }
    

    【讨论】:

    • 考虑将此作为评论发布?
    • 根据该站点的政策,不鼓励使用“仅链接答案”并将其删除答案需要包含的不仅仅是指向外部站点的链接。尝试添加一些有价值的东西地点。您可以发布链接,但随后可能会添加对您链接到的内容、如何使用它等的解释。
    • @long.kl 很有趣。
    【解决方案3】:

    考虑 Clang __builtin_dump_struct

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      相关资源
      最近更新 更多