18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 建站知识 > C语言使用连接符##来优雅的创建多个结构体

C语言使用连接符##来优雅的创建多个结构体

时间:2023-02-20 04:42:02 | 来源:建站知识

时间:2023-02-20 04:42:02 来源:建站知识

C语言使用连接符##来优雅的创建多个结构体:

问题的背景


假设有一个C程序,需要创建很多结构体来记录各个学生的信息,然后统一的将这些学生的信息打印出来。

例如 例如下述程序创建了A同学的记录

#include <stdio.h>typedef struct { char name[20]; int age; int score; int grade;}Student;Student A = { "petter", 8, 90, 1,};Student * studentList[] = { &A,};int main(void){ for(int i=0;i<sizeof(studentList)/sizeof(Student *);i++){ printf("name = %s,age = %d,score = %d,grade = %d/r/n", / studentList[i]->name,studentList[i]->age,studentList[i]->score,studentList[i]->grade); } return 0;}现在人数变多了,增加了三个人的数据信息,分别是一年级学生lucy还有两个二年级学生nancy和matt。

#include <stdio.h>typedef struct { char name[20]; int age; int score; int grade;} Student;Student petter = { "petter", 8, 90, 1,};Student lucy = { "lucy", 8, 100, 1,};Student nancy = { "nancy", 9, 60, 2,};Student matt = { "matt", 9, 55, 2};Student *studentList[] = {&petter, &lucy, &nancy, &matt};int main(void) { for (int i = 0; i < sizeof(studentList) / sizeof(Student *); i++) { printf("name = %s,age = %d,score = %d,grade = %d/r/n", studentList[i]->name, studentList[i]->age, studentList[i]->score, studentList[i]->grade); } return 0;}这个时候我们发现,四个学生,声明结构体的代码就很长了,不好看。如果来了更多的学生数据,那岂不是代码越来越长了吗?多一个学生数据会多6行。那么如何用一个更好的写法来优雅的解决这个问题呢?

C语言连接符 "##"

#include <stdio.h>int algorithm_add_op(int num1, int num2) { return num1+num2;}int algorithm_sub_op(int num1, int num2) { return num1 - num2;}#define ALGORITHM(name, num1, num2) / algorithm_##name##_op(num1, num2)int main() { printf("%d/n", ALGORITHM(add, 1, 2)); printf("%d/n", ALGORITHM(sub, 1, 2)); return 0;}看上述代码 ALOGORITHM函数把输入的子串和algorithm和_op连接起来,使得编译器调度到对应二点操作函数
可以看到"##"的作用,就是将两个子串连接起来。

使用连接符来简化起始问题

#include <stdio.h>typedef struct { char name[20]; int age; int score; int grade;}Student;#define DECLARE_GRADE_1_AGE_8_STUDENT(name,score) / static const Student Student_##name = { / #name,8,score,1 / };#define DECLARE_GRADE_2_AGE_9_STUDENT(name,score) / static const Student Student_##name = { / #name,9,score,2 / };#define DECLARE_STUDENT(name,age,score,grade) / static const Student Student_##name = { / #name,age,score,grade / };DECLARE_GRADE_1_AGE_8_STUDENT(petter,90)DECLARE_GRADE_1_AGE_8_STUDENT(lucy,100)DECLARE_GRADE_2_AGE_9_STUDENT(nancy,60)DECLARE_GRADE_2_AGE_9_STUDENT(matt,55)Student const * studentList[] = { &Student_petter, &Student_lucy, &Student_nancy, &Student_matt};int main(void){ for(int i=0;i<sizeof(studentList)/sizeof(Student *);i++){ printf("name = %s,age = %d,score = %d,grade = %d/r/n", / studentList[i]->name,studentList[i]->age,studentList[i]->score,studentList[i]->grade); } return 0;}上述代码我们定义了一个宏,这个宏有两个输入参数,作用是创建一个结构体变量,通过name来给这个结构体变量命名,结构体名称使用到了连接符。
在第一个元素name中使用了另一个连接符 # 把petter这样的token转化为了字符串。

这样写法的优势在于

  1. 整合了不同的结构体相同的部分,减少代码长度,例如都是8岁和一年级,就一并使用DECLARE_GRADE_1_AGE_8_STUDENT来声明,如果不希望分类,那么宏的输入参数增加数量就可以了(DECLARE_STUDENT)。
  2. 简洁,从前新增一个学生结构体,需要很多代码,不漂亮,现在只需要调用一个声明宏,就可以优雅的创建结构体。
这样的写法可以用来描述一些只读的信息,甚至可以把这些代码放到头文件中也不会显得突兀。有非常多的优点。

这样的写法你学到了吗?如果你也觉得代码漂亮,或者眼前一亮,是否点个赞呢?

关键词:创建,结构,连接,使用,语言

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭