首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在头文件中声明数组

在头文件中声明数组
EN

Stack Overflow用户
提问于 2017-03-30 21:15:12
回答 3查看 4K关注 0票数 1

我正在努力优化一个人生游戏。我需要从头文件中修改这段代码:

代码语言:javascript
复制
  #define MASK(col) (0x80 >> ((col) & 7))

(变量"col“是一个将保存列的变量,从0到8)

像这样的事情:

代码语言:javascript
复制
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)...)

我在这段代码中遇到的错误如下:

代码语言:javascript
复制
"#10010 errors encountered during linking "life.out" not built"
"#10056 "array" redefined: first defined in './lifelib.obj', redefined in 
'./life.obj'"

(Ps.:我已经将数组的名称更改为:"OKDPSAdiahodakDSA“,但仍然有相同的错误)

PS:这个错误只发生在我做这个改变的时候。整个代码运行良好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-30 21:39:11

我认为您已经在头文件中定义了数组,并且(直接或间接)将其包含在两个C文件中:

  • life.c
  • lifelib.c

当编译器生成obj文件时,它会在每个文件中看到数组的定义,因此它将数组包含在两个obj文件中。然后,当链接器试图生成文件时,它会发现两个重复的数组,每个obj都有一个。

您应该在头文件中声明变量extern,并且只在一个c文件中定义它。您可以找到更多信息,这里

票数 2
EN

Stack Overflow用户

发布于 2017-03-30 21:23:17

问题是你使用的是宏。

C宏由C预处理器处理,它在代码编译之前运行。因此宏不知道任何关于变量的信息,这些变量只在编译过程中作为命名实体存在。您正在尝试使用您的MASK宏,就好像它知道变量arraycol存在一样,但是宏对数组一无所知--它们只是进行文字文本替换。

所以如果你做这样的事

int x=掩码(9);

文本

int x= array9;

注入到你的代码中。这就是为什么即使您更改了数组的名称,也会看到与array相关的错误。

解决这一问题的最简单方法是将数组的名称更改为您知道永远不会使用的东西,比如__life_mask_array

这样您就可以将代码更改为如下内容:

代码语言:javascript
复制
int __life_mask_array[9] = { 0, 64, 32, 16, 8, 4, 2, 1};
#define MASK(col) (__life_mask_array[col])

这就减少了名字碰撞的可能性。

当然,除非非常需要使用宏,否则可以完全取消宏,只访问数组。C宏往往比它们的价值更麻烦,因为它们会进行文本替换,如果宏在其封闭作用域中使用了名称,则可能会导致异常行为。通常的做法是在宏中使用的变量名前缀带有下划线,以避免名称冲突,但是没有确保您不会遇到麻烦的方法。

票数 0
EN

Stack Overflow用户

发布于 2017-03-31 00:24:46

非常感谢。我的代码基本上是速度的两倍。这里的每个人都帮了很多忙。我希望我能给每个人“最好的答案”检查标记。

我做了以下工作:我更改了我的“file.h”文件的这一部分:

代码语言:javascript
复制
#define MASK(col) (0x80 >> ((col) % 8))

对此:

代码语言:javascript
复制
  #define MASK(col) (0x80 >> ((col) & 7))

因此,我删除了/擦除/注释掉了‘#定义掩码’,并执行了以下操作:

在我的“life.c.c”文件上,我创建了以下数组:

代码语言:javascript
复制
int __life_mask_array[] = { 128, 64, 32, 16, 8, 4, 2, 1 };

在我的“file .h”档案中有以下内容:

代码语言:javascript
复制
extern int __life_mask_array[]
#define MASK(col) (array[(col)&7])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43128480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档