是否可以将数组初始值设定项用作数组(有点像字符串文字?)
#define TETRAMINO_I {{1,1,1,1},{0,0,0,0}}
printf("%c",(TETRAMINO_I[0][0]) ? "#" : ' ');
(这段代码显然行不通。
我想出了以下解决方案(绕过这个要求)
#define TETRAMINO_I {{1,1,1,1},{0,0,0,0}}
#define TETRAMINO_J {{1,1,1,0},{0,0,1,0}}
#define TETRAMINO_L {{1,1,1,0},{1,0,0,0}}
#define TETRAMINO_O {{1,1,0,0},{1,1,0,0}}
#define TETRAMINO_S {{0,1,1,0},{1,1,0,0}}
#define TETRAMINO_T {{1,1,1,0},{0,1,0,0}}
#define TETRAMINO_Z {{1,1,0,0},{0,1,1,0}}
typedef unsigned char byte;
typedef struct tetraminos{
char I[2][4];
char J[2][4];
char L[2][4];
char O[2][4];
char S[2][4];
char T[2][4];
char Z[2][4];
}tet_minos_t;
tet_minos_t tet_mino_blocks{ TETRAMINO_I,TETRAMINO_J,TETRAMINO_L,TETRAMINO_O,TETRAMINO_S,TETRAMINO_T,TETRAMINO_Z};
使用结构的全局实例。但是,在尝试使用时:
newMino->blocks = (char**)tet_mino_blocks.I;
printf("%c",(newMino->blocks[0][0]) ? "#" : ' ');
我无法打印(出现段错误)
最佳答案
是的,有点,但是你必须给你的数组一个类型。从 C99 开始,我们有了复合文字:
#define TETRAMINO_C ((unsigned char const[][4])TETRAMINO_I)
这为数组提供了 const
限定类型(语法上类似于强制转换)。该类型是 const
限定的,因此如果必须的话,编译器对如何分配数组的限制较少。允许为数组的所有使用分配一个静态副本。
但是,如果您仅按照 TETRAMINO_C[0][0]
中的说明使用它,现代 C 编译器的体面优化器应该能够完全优化数组并且只直接使用常量.
关于c - 使用数组初始值设定项作为静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974244/