# 给大家介绍一种 #define 的骚操作:用宏定义封装函数去遍历结构体并改变一个结构体的属性。

在 C 语言中,我们经常需要对结构体数组进行遍历,并对其中的某个属性进行修改。为了简化这一过程,我们可以使用宏定义来实现这个功能。下面是一个示例代码,通过宏定义来遍历结构体数组并修改特定的属性。

# 首先,我们需要定义一个结构体,用于表示学生信息。在本示例中,我们的学生结构体包含 idnamescore 三个属性。

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}
	};
	// 修改 score 属性
	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;
}
//***************************//
//          输出结果
//id: 1, name: Alice, score: 100
//id: 2, name: Chai, score: 100
//id: 3, name: Flechazo, score: 100
//***************************//

是不是很猛,哇,我看到这种用法惊呆了!

可以优化掉很多代码的好吧!

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

flechazo 微信支付

微信支付

flechazo 支付宝

支付宝

flechazo 贝宝

贝宝