编写C ++函数来对外部声明的数组进行操作

时间:2015-03-22 21:51:49

标签: c++ arrays const extern linkage

我正在尝试编写一组在数组上实现各种操作的C ++函数(a.ha.cpp)。实际数组将在其他文件中定义(b.hb.cppc.hc.cpp等。)

我的目标是任何项目都可以#include "a.h"并在该项目中定义的数组上运行这些函数。我不想在a.h本身中包含任何内容,因为我希望将来的任何项目都能够使用a.h而不重写它。但是,我无法弄清楚如何使用extern来执行此操作。

这是我迄今为止所拥有的玩具示例。 a实现了一个函数f,用于尚未指定的数组。

A.H

// this is not right, but I'm not sure what to do instead
extern const int ARRAY_LEN;
extern int array[ARRAY_LEN]; // error occurs here

void f();

a.cpp

#include "a.h"

// Do something with every element of "array"
void f() {
  for(int i=0; i < ARRAY_LEN; i++) {
    array[i];
  }
}

现在,项目b定义了数组,并希望在其上使用函数f

b.h

const int ARRAY_LEN = 3;

b.cpp

#include "a.h"
#include "b.h"

int array[ARRAY_LEN] = {3, 4, 5};

// Some functions here will use f() from a.cpp

当我编译它时,我得到:

In file included from b.cpp:1:0:
a.h:2:27: error: array bound is not an integer constant before ‘]’ token

我读了其他相关的问题:

...但我看不出如何将解决方案应用到我的案例中。问题是通常人们最终#include - 定义数组的文件,我想反过来做:在新项目中定义数组,#include共享集在该阵列上操作的函数。


编辑1:如果我使用以下内容替换arraya.h的声明,请参阅@ id256:

extern int array[];

然后我得到一个不同的错误:

multiple definition of `ARRAY_LEN'

编辑2:我也尝试了以下答案:

Why does "extern const int n;" not work as expected?

基本上,我将“extern const int ARRAY_LEN”添加到b.h以“强制外部链接”。所以现在:

b.h

extern const int ARRAY_LEN;
const int ARRAY_LEN = 3;

..和所有其他文件与原来的相同。但我得到了同样的原始错误:

a.h:2:27: error: array bound is not an integer constant before ‘]’ token

1 个答案:

答案 0 :(得分:0)

当将数组声明为extern时,您不需要指定大小(对于多维数组,您仍需要除第一个维之外的所有数组)。只需使用:

extern int array[];

或者,在a.h中包含b.h(在声明数组之前),以便在声明数组时可以看到ARRAY_LEN的定义。