如何循环遍历变量名?C语言结构体数组赋值问题求助
问题分析
你的代码编译失败的核心原因是:宏是编译时文本替换工具,而for循环里的i、j是运行时变量。你试图用宏把运行时的变量值拼接到结构体成员名里,这完全行不通——预处理器在编译阶段根本不知道i、j的实际值,没法完成tile##i##j的拼接。
解决方案
针对3x3的固定规模,有两种简单可行的实现方式:
方案1:用预处理器生成所有赋值语句(编译时展开)
既然是固定的3x3,可以用预处理器的宏展开直接生成所有9条赋值语句,效果和你手动写的一样,但代码更简洁:
#include <stdio.h> typedef struct TILE {} TILE; typedef struct REGS { TILE tile00, tile01, tile02, tile10, tile11, tile12, tile20, tile21, tile22; } REGS; // 辅助宏:生成单条赋值语句 #define ASSIGN_TILE(i, j) regs.tile##i##j = tiles[i][j] // 展开一行的3个赋值操作 #define ASSIGN_ROW(i) \ ASSIGN_TILE(i, 0); \ ASSIGN_TILE(i, 1); \ ASSIGN_TILE(i, 2); int main() { TILE tiles[3][3]; REGS regs; // 展开所有3行的赋值 ASSIGN_ROW(0); ASSIGN_ROW(1); ASSIGN_ROW(2); return 0; }
预处理器会把这些宏展开成你最初手动写的9条赋值语句,编译完全正常。
方案2:利用结构体内存布局,用数组方式访问成员
因为REGS里的所有tile成员都是同类型TILE,且在结构体里是连续排列的(默认布局下,同类型成员不会被插入额外填充),可以把结构体的tile成员当成一维数组来访问:
#include <stdio.h> typedef struct TILE { int val; } TILE; // 给TILE添加成员避免空结构体的编译问题 typedef struct REGS { TILE tile00, tile01, tile02, tile10, tile11, tile12, tile20, tile21, tile22; } REGS; int main() { TILE tiles[3][3]; REGS regs; // 把regs的tile成员转换为一维数组指针 TILE* regs_tiles = ®s.tile00; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { // 通过i*3+j计算一维数组的索引,完成赋值 regs_tiles[i*3 + j] = tiles[i][j]; } } return 0; }
这种方式真正使用了循环,适合规模更大的场景。如果担心编译器插入填充,可以添加编译指令强制结构体紧凑布局,比如在结构体定义前加上#pragma pack(1)。
内容的提问来源于stack exchange,提问作者Xingx1
相关产品推荐
相关产品推荐

