Я пытаюсь написать набор функций C++ (a.h
, a.cpp
), которые реализуют различные операции над массивами. Фактические массивы будут определены в других файлах (b.h
, b.cpp
, c.h
, c.cpp
и т. Д.).Запись функции C++ для работы с объявленными внешними массивами
Моя цель заключается в том, что любой проект может #include "a.h"
и выполнять эти функции на массивах, определенных в этом проекте. Я не хочу включать что-либо в a.h
сам, потому что я хочу, чтобы любой будущий проект мог использовать a.h
, не переписывая его. Но я не могу понять, как использовать extern
для этого.
Вот пример игрушки того, что у меня до сих пор. a
реализует функцию f
, которая будет использоваться в еще не заданном массиве.
хиджры
// 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
на нем.
ЬН
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
- файлы, которые определяют массив, и я хочу сделать это наоборот: определить массив в новом проекте и #include
общий набор функций для работы с этим массивом.
Edit 1: Если я заменю декларацию array
в a.h
со следующим, как это было предложено @ id256:
extern int array[];
Тогда я получаю другую ошибку:
multiple definition of `ARRAY_LEN'
Редактировать 2: Я также пробовал ответить от:
Why does "extern const int n;" not work as expected?
В принципе, я добавил "EXTERN сопз 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
Так в чем проблема с объявлением 'extern int array []'? – tonso
Это должно быть сделано путем передачи массивов в качестве параметра в функции; не используя глобальные переменные. –
Используйте 'std :: vector' и передайте массивы или векторы по опорным параметрам. –