C语言中结构打印函数的自动生成

toe95027  于 2023-02-18  发布在  其他
关注(0)|答案(2)|浏览(140)

我有很多程序都定义了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语言不支持反射,所以,我为我定义的每个结构体编写了这些打印函数。
但是,我想知道是否存在自动生成这些打印函数的技巧。我会理解我必须修改这些函数。但是,如果部分工作是自动完成的,那就太好了。(这个例子很简单,有时结构体是嵌套的,或者我有结构体数组,或者一些字段是指针,...)

k5hmc34c

k5hmc34c1#

当然,你可以打印结构体,但是会有很多不可读的输出:

#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)\t%.2X: %.*s\n", 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'。
由于指针的工作方式,您无法判断成员是指针还是非指针。
另一个问题是结构有填充来帮助对齐,以及更好/有效地使用内存。所以你会看到中间有很多0x 00。

记住C是一种编译语言。

7cwmlq89

7cwmlq892#

让我们考虑使用https://copilot.github.com/,它很棒,这就是我在copilot中所拥有

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\n", s->name);
    printf("address: %s\n", s->address);
    printf("zip: %d\n", s->zip);
}

相关问题