# 给大家介绍一种 #define 的骚操作:用宏定义封装函数去遍历结构体并改变一个结构体的属性。
在 C 语言中,我们经常需要对结构体数组进行遍历,并对其中的某个属性进行修改。为了简化这一过程,我们可以使用宏定义来实现这个功能。下面是一个示例代码,通过宏定义来遍历结构体数组并修改特定的属性。
# 首先,我们需要定义一个结构体,用于表示学生信息。在本示例中,我们的学生结构体包含 id
、 name
和 score
三个属性。
| typedef struct Student { |
| int id; |
| char *name; |
| int score; |
| } Student; |
# 接下来,我们使用宏定义来实现遍历结构体数组并修改特定属性的功能。下面是这个宏定义的代码:
| #define MODIFY_ATTR(arr, n, attr, val) do {\ |
| for (int i = 0; i < n; ++i) {\ |
| arr[i].attr = val;\ |
| }\ |
| } while (0) |
这个宏定义接受四个参数: arr
表示结构体数组的名称, n
表示数组的长度, attr
表示要修改的属性, val
表示要修改成的值。宏定义内部使用了一个循环,遍历结构体数组,并将指定属性的值修改为给定的值。
# 接下来,我们在主函数中使用这个宏定义来演示其用法。首先,我们定义了一个包含三个学生信息的结构体数组 students
。
| Student students[3] = { |
| {1, "Alice", 80}, |
| {2, "Chai", 91}, |
| {3, "Flechazo", 95} |
| }; |
# 然后,我们调用了 MODIFY_ATTR
宏来将所有学生的成绩改为 100。
| MODIFY_ATTR(students, 3, score, 100); |
# 最后,我们通过循环遍历结构体数组,并输出每个学生的信息,以验证修改结果。
| for (int i = 0; i < 3; ++i) { |
| printf("id: %d, name: %s, score: %d\n", students[i].id, students[i].name, students[i].score); |
| } |
# 运行上述代码,我们可以看到修改后的结果:
| id: 1, name: Alice, score: 100 |
| id: 2, name: Chai, score: 100 |
| id: 3, name: Flechazo, score: 100 |
通过上述示例,我们展示了如何使用宏定义来遍历结构体数组并修改特定属性。使用宏定义可以简化代码的书写,提高开发效率。当需要对结构体数组中的某个属性进行批量修改时,宏定义是一个有用的工具。
# 完整代码:
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| |
| typedef struct Student { |
| int id; |
| char name[24]; |
| int score; |
| } Student; |
| |
| |
| #define MODIFY_ATTR(arr, n, attr, val) do {\ |
| for (int i = 0; i < n; ++i) {\ |
| arr[i].attr = val;\ |
| }\ |
| } while (0) |
| |
| int main() { |
| |
| Student students[3] = { |
| {1, "Alice", 80}, |
| {2, "Chai", 91}, |
| {3, "Flechazo", 95} |
| }; |
| |
| |
| MODIFY_ATTR(students, 3, score, 100); |
| |
| |
| for (int i = 0; i < 3; ++i) { |
| printf("id: %d, name: %s, score: %d\n", students[i].id, students[i].name, students[i].score); |
| } |
| |
| return 0; |
| } |
| |
| |
| |
| |
| |
| |
是不是很猛,哇,我看到这种用法惊呆了!
可以优化掉很多代码的好吧!