定义一个非常大的数组(查找表)的最佳方法是什么?

时间:2012-02-12 17:36:58

标签: c++ arrays

我必须在代码中定义一个大型数组(查找表)。 它包含256个元素,占用近1个电脑屏幕。

有两个函数正在使用此数组。 我想在函数下定义这个数组,所以我可以在开发过程中非常快地访问它们。

但如果我尝试在一个文件中执行此操作,编译器将在函数周围给出“未声明的标识符”错误 - 因为它们使用数组。

因此,我必须将函数和数组放在单独的文件中。

以下是我的计划结构:

main.cpp:

#include "lookup.h"

...uses two functions...

-

lookup.h:

#ifndef SubMaster_lookup_h
#define SubMaster_lookup_h

void func1(void);
void func2(void);

char LookupTable[][3]={ "00", "01", "02" "03", "04", "05", "06", "07", "08", "09",
"0a", "0b", "0c", "0d", "0e", "0f", "00", "01", "02" "03", "04", "05", "06", "07",
"08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11", "12", "13", and so on...}

-

lookup.cpp:

#include "lookup.h"

void func1() {
   ...body of func1...
}

void func2() {
   ...body of func2...
}

以下结构在构建期间为我提供了“ld:duplicate symbol _LookupTable”。 有没有办法改变结构,所以不会出错?

3 个答案:

答案 0 :(得分:9)

两种方式:

  • 在标头中声明数组,在cpp文件中定义
  • 让它静止。但这非常讨厌(每个翻译单元都会得到自己的副本)

试试这个:

lookup.h
extern char LookupTable[][3];

lookup.cpp
#include "lookup.h"

char LookupTable[][3] = ...

answer很好。

答案 1 :(得分:2)

将其放入.cpp并将extern声明写入.h。或者,将其标记为static(但这将导致包含.cpp的每个.h的查找表的附加副本,因此您应该避免使用它。)

答案 2 :(得分:2)

您可以在标头中添加extern char const lookupTable[][3];,并在源文件中包含实际实现:

#include "header.h"

char const lookupTable[][3] = { /* ... */ }

或者,在标题中将数组声明为static char const lookupTable[][3] = /*...*/,但随后在每个TU中都会重复复制(每个都有静态(即内部)链接)。