我正在将一个游戏从Sega Genesis移植到Sega Saturn,并限制在C.我也在关注游戏如何在摩托罗拉68000汇编代码中编码尽可能接近,这需要许多很多阵列相同的结构。我说的是300以上。为了组织和可读性,用数字而不是字符串命名它们会更容易
例如,我会更喜欢:
int 000[4] = {1, 2, 3, 4};
int 001[4] = {1, 2, 3, 4};
相反:
int zerozerozero[4] = {1, 2, 3, 4};
int zerozeroone[4] = {1, 2, 3, 4};
但是我的编译器不会编译,除非数组名称以字符开头。有没有办法做到这一点?我想我可以在数组的前面抛出一个a
,但如果可能的话,我想避免这种情况。
答案 0 :(得分:72)
这是一个非常奇怪的设计。
在人类意义上,一个数字实际上不是一个名字。没有人阅读代码将理解名为_031
的数组的含义。
你应该弄清楚所有这些数组的共同点,并使用一个带有描述性名称的多维数组。
所以而不是
int _001[4];
int _002[4];
...
int _300[4];
你应该有像
这样的东西int whatever[300][4];
然后,只要您访问_002
,您只需访问whatever[1]
即可。更清洁。如果您愿意,可以添加一个并使其301
并使用基于1的索引。
答案 1 :(得分:31)
不可能这样做,不。
但是,您可以使用任何有效字符(例如字母或下划线)开始变量名称,然后创建其余数字。
例如,您可以int 001[4]
代替int _001[4]
。
对于那些只是阅读我的答案的人 - 请大家放松一下,他们在下面回答这对于人类阅读或可用性而言不是很好的设计。有关详细信息,请参阅并提出他的回答。
答案 2 :(得分:1)
不,永远不会。
记住小孩,标识符的正则表达式(C-wise)是[_a-zA-Z][0-9a-zA-Z]*
,十进制数的正则表达式(C-wise)是[0-9]*
!您的编译器可以将000
(等)视为十进制数,而不是“错误地”#39;把它当作一个表达式,然后创建一个巨大的编译器灾难!
编辑:为什么C禁止使用带数字前缀的标识符?
C允许后缀的一个重要概念。
例如,考虑这个伪代码:
int 01234;
int 01234l;
如果我们将标识符的正则表达式修改为[_0-9a-zA-Z]*
,不仅会使其与十进制数的范围重叠,还可能会重叠特殊后缀的范围,例如l
,ul
,f
或d
。我们人类可以确定阅读和分组这些东西,但计算机不能!计算机无法解决歧义,否则将永远死亡!