1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| #include <stdio.h> #include <stdlib.h> #include <string.h>
#define AUTO_VAR(type, name, value) type name = value #define AUTO_ARRAY(type, name, size) type name[size] = {0}
#define SAFE_FREE(ptr) \ do { \ if (ptr) { \ free(ptr); \ ptr = NULL; \ } \ } while(0)
#define SAFE_MALLOC(ptr, type, count) \ do { \ ptr = (type*)malloc(sizeof(type) * (count)); \ if (!ptr) { \ fprintf(stderr, "内存分配失败: %s:%d\n", __FILE__, __LINE__); \ exit(EXIT_FAILURE); \ } \ } while(0)
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) #define ARRAY_FOREACH(arr, var) \ for (size_t _i = 0; _i < ARRAY_SIZE(arr) && ((var) = (arr)[_i], 1); _i++)
#define MAX(a, b) ({ \ typeof(a) _a = (a); \ typeof(b) _b = (b); \ _a > _b ? _a : _b; \ })
#define MIN(a, b) ({ \ typeof(a) _a = (a); \ typeof(b) _b = (b); \ _a < _b ? _a : _b; \ })
#define SWAP(a, b) \ do { \ typeof(a) temp = (a); \ (a) = (b); \ (b) = temp; \ } while(0)
#define IN_RANGE(value, min, max) ((value) >= (min) && (value) <= (max))
#define OFFSET_OF(type, member) ((size_t)&((type*)0)->member)
#define CONTAINER_OF(ptr, type, member) \ ((type*)((char*)(ptr) - OFFSET_OF(type, member)))
typedef struct { int id; char name[32]; double score; } Student;
void advanced_macros_demo() { printf("=== 高级宏应用演示 ===\n"); AUTO_VAR(int, count, 10); AUTO_ARRAY(char, buffer, 256); printf("count = %d, buffer size = %zu\n", count, sizeof(buffer)); int* numbers; SAFE_MALLOC(numbers, int, 5); for (int i = 0; i < 5; i++) { numbers[i] = i * i; } printf("动态数组: "); for (int i = 0; i < 5; i++) { printf("%d ", numbers[i]); } printf("\n"); SAFE_FREE(numbers); int arr[] = {3, 1, 4, 1, 5, 9, 2, 6}; printf("数组大小: %zu\n", ARRAY_SIZE(arr)); printf("数组元素: "); int element; ARRAY_FOREACH(arr, element) { printf("%d ", element); } printf("\n"); int a = 10, b = 20; printf("a = %d, b = %d\n", a, b); printf("MAX(a, b) = %d\n", MAX(a, b)); printf("MIN(a, b) = %d\n", MIN(a, b)); SWAP(a, b); printf("交换后: a = %d, b = %d\n", a, b); int score = 85; printf("分数 %d %s\n", score, IN_RANGE(score, 0, 100) ? "有效" : "无效"); printf("Student.id 偏移: %zu\n", OFFSET_OF(Student, id)); printf("Student.name 偏移: %zu\n", OFFSET_OF(Student, name)); printf("Student.score 偏移: %zu\n", OFFSET_OF(Student, score)); Student student = {1, "张三", 95.5}; char* name_ptr = student.name; Student* student_ptr = CONTAINER_OF(name_ptr, Student, name); printf("通过name指针获取结构体: id=%d, score=%.1f\n", student_ptr->id, student_ptr->score); printf("\n"); }
int main() { advanced_macros_demo(); return 0; }
|