我正在尝试优化生活游戏。 我需要从头文件中更改此代码:
git remote add repoB ../B
(变量“col”是一个将保存列的变量,它从0到8)
对于这样的事情:
git fetch repoB
git checkout A
git merge repoB/B
我使用此代码获得的错误如下:
#define MASK(col) (0x80 >> ((col) & 7))
(Ps。:我已将数组的名称更改为:“OKDPSAdiahodakDSA”,我仍然遇到同样的错误)
PS:此错误仅在我进行此更改时发生。整个代码工作正常。
答案 0 :(得分:2)
我认为您已在头文件中定义了数组,并且已将其(直接或间接)包含在两个C文件中:
当编译器生成obj文件时,它会在每个文件中看到数组的定义,因此它将它包含在两个obj文件中。然后,当链接器尝试生成文件时,它会找到两个重复的数组,每个对象一个。
您应该在标头中声明变量extern,并仅在一个c文件中定义它。您可以找到更多信息here。
答案 1 :(得分:0)
问题是您正在使用宏。
C宏由C preprocessor处理,{<3}}在代码编译之前运行。所以宏对变量一无所知,这些变量在编译期间只作为命名实体存在。您正在尝试使用MASK
宏,就好像它知道存在变量array
和col
一样,但宏并不了解有关数组的任何内容 - 它们只是进行文字文本替换。
所以,如果你做了像
这样的事情int x = MASK(9);
文字
int x = array [9];
注入您的代码。这就是为什么即使您更改了数组的名称,您也会看到与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宏往往比它们的价值更麻烦,因为它们进行文本替换,如果宏使用其封闭范围内存在的名称,可能会导致内容出现意外行为。通常的做法是在带有下划线的宏中使用变量名称作为前缀,以避免名称冲突,但是没有必要的方法来保证您不会遇到麻烦。
答案 2 :(得分:0)
非常感谢你。我的代码基本上加倍了速度。这里的每个人都帮助了TON。我希望我能给每个人“最佳答案”复选标记。
我做了以下事情: 我改变了'life.h'文件的这一部分:
#define MASK(col) (0x80 >> ((col) % 8))
对此:
#define MASK(col) (0x80 >> ((col) & 7))
所以我删除/删除/评论了'#define MASK'并执行了以下操作:
在我的'life.c'文件中,我创建了以下数组:
int __life_mask_array[] = { 128, 64, 32, 16, 8, 4, 2, 1 };
在我的'life.h'文件中有以下内容:
extern int __life_mask_array[]
#define MASK(col) (array[(col)&7])