我正在努力优化一个人生游戏。我需要从头文件中修改这段代码:
#define MASK(col) (0x80 >> ((col) & 7))(变量"col“是一个将保存列的变量,从0到8)
像这样的事情:
int array[9] = { 0, 64, 32, 16, 8, 4, 2, 1};
#define MASK(col) (array[col])
(((0) & 7) = 0, ((1) & 7) = 64, ((2) & 7) = 32, ((3) & 16)...)我在这段代码中遇到的错误如下:
"#10010 errors encountered during linking "life.out" not built"
"#10056 "array" redefined: first defined in './lifelib.obj', redefined in
'./life.obj'"(Ps.:我已经将数组的名称更改为:"OKDPSAdiahodakDSA“,但仍然有相同的错误)
PS:这个错误只发生在我做这个改变的时候。整个代码运行良好。
发布于 2017-03-30 21:39:11
我认为您已经在头文件中定义了数组,并且(直接或间接)将其包含在两个C文件中:
当编译器生成obj文件时,它会在每个文件中看到数组的定义,因此它将数组包含在两个obj文件中。然后,当链接器试图生成文件时,它会发现两个重复的数组,每个obj都有一个。
您应该在头文件中声明变量extern,并且只在一个c文件中定义它。您可以找到更多信息,这里。
发布于 2017-03-30 21:23:17
问题是你使用的是宏。
C宏由C预处理器处理,它在代码编译之前运行。因此宏不知道任何关于变量的信息,这些变量只在编译过程中作为命名实体存在。您正在尝试使用您的MASK宏,就好像它知道变量array和col存在一样,但是宏对数组一无所知--它们只是进行文字文本替换。
所以如果你做这样的事
int x=掩码(9);
文本
int x= array9;
注入到你的代码中。这就是为什么即使您更改了数组的名称,也会看到与array相关的错误。
解决这一问题的最简单方法是将数组的名称更改为您知道永远不会使用的东西,比如__life_mask_array。
这样您就可以将代码更改为如下内容:
int __life_mask_array[9] = { 0, 64, 32, 16, 8, 4, 2, 1};
#define MASK(col) (__life_mask_array[col])这就减少了名字碰撞的可能性。
当然,除非非常需要使用宏,否则可以完全取消宏,只访问数组。C宏往往比它们的价值更麻烦,因为它们会进行文本替换,如果宏在其封闭作用域中使用了名称,则可能会导致异常行为。通常的做法是在宏中使用的变量名前缀带有下划线,以避免名称冲突,但是没有确保您不会遇到麻烦的方法。
发布于 2017-03-31 00:24:46
非常感谢。我的代码基本上是速度的两倍。这里的每个人都帮了很多忙。我希望我能给每个人“最好的答案”检查标记。
我做了以下工作:我更改了我的“file.h”文件的这一部分:
#define MASK(col) (0x80 >> ((col) % 8))对此:
#define MASK(col) (0x80 >> ((col) & 7))因此,我删除了/擦除/注释掉了‘#定义掩码’,并执行了以下操作:
在我的“life.c.c”文件上,我创建了以下数组:
int __life_mask_array[] = { 128, 64, 32, 16, 8, 4, 2, 1 };在我的“file .h”档案中有以下内容:
extern int __life_mask_array[]
#define MASK(col) (array[(col)&7])https://stackoverflow.com/questions/43128480
复制相似问题