编写 C++ 函数以对外部声明的数组进行操作
Writing a C++ function to operate on arrays declared externally
我正在尝试编写一组 C++ 函数(a.h
、a.cpp
)来实现对数组的各种操作。实际数组将在其他文件中定义(b.h
、b.cpp
、c.h
、c.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
我阅读了其他相关问题:
- initialize array with constant number does not work
- "array bound is not an integer constant before ']' token" when using multiple files
- Why does "extern const int n;" not work as expected?
...但我看不到如何将解决方案应用到我的案例中。问题是通常人们最终 #include
-ing 定义数组的文件,我想反过来做:在新项目中定义数组,#include
共享集对该数组进行操作的函数数。
编辑 1:如果我按照@id256 的建议将 a.h
中的 array
声明替换为以下内容:
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
上是为了"force external linkage"。所以现在:
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
将数组声明为 extern
时,无需指定大小(对于多维数组,除第一维外,您仍然需要指定大小)。只需使用:
extern int array[];
或者,在 a.h 中包含 b.h(在声明数组之前),以便在声明数组时可以看到 ARRAY_LEN
的定义。
我正在尝试编写一组 C++ 函数(a.h
、a.cpp
)来实现对数组的各种操作。实际数组将在其他文件中定义(b.h
、b.cpp
、c.h
、c.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
我阅读了其他相关问题:
- initialize array with constant number does not work
- "array bound is not an integer constant before ']' token" when using multiple files
- Why does "extern const int n;" not work as expected?
...但我看不到如何将解决方案应用到我的案例中。问题是通常人们最终 #include
-ing 定义数组的文件,我想反过来做:在新项目中定义数组,#include
共享集对该数组进行操作的函数数。
编辑 1:如果我按照@id256 的建议将 a.h
中的 array
声明替换为以下内容:
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
上是为了"force external linkage"。所以现在:
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
将数组声明为 extern
时,无需指定大小(对于多维数组,除第一维外,您仍然需要指定大小)。只需使用:
extern int array[];
或者,在 a.h 中包含 b.h(在声明数组之前),以便在声明数组时可以看到 ARRAY_LEN
的定义。