2015-03-22 7 views
2

Я пытаюсь написать набор функций 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 

Я прочитал эти другие вопросы, которые относятся:

... но я не могу понять, как применять решения к моему делу. Проблема состоит в том, что обычно люди заканчивают #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 
+0

Так в чем проблема с объявлением 'extern int array []'? – tonso

+3

Это должно быть сделано путем передачи массивов в качестве параметра в функции; не используя глобальные переменные. –

+0

Используйте 'std :: vector' и передайте массивы или векторы по опорным параметрам. –

ответ

0

При объявлении массива в качестве extern, вам не нужно указывать размер (для многомерного массива, вам все еще нужно все, кроме первого измерения). Просто используйте:

extern int array[]; 

В качестве альтернативы, включают b.h в хиджры (перед тем как объявить массив), так что определение ARRAY_LEN видна при объявлении массива.

+0

Хм, я думаю, что мой «Редактировать 1» обращается к вашему первому предложению, и это приводит к другой ошибке. Что касается вашего второго предложения, я согласен, что это сработает, но основная причина, по которой я задаю этот вопрос, состоит в том, что я не хочу включать b.h в a.h или для a.h, чтобы знать что-либо о b.h. – cxrodgers

+0

@cxrodgers удаляет объявление ARRAY_LEN из a.h; он не соответствует определению ARRAY_LEN в b.h, и вам не разрешено иметь две неверные сопоставления деклараций/определений одной и той же вещи. – immibis

+0

Хорошо, я попробовал это. Мне также пришлось добавить 'extern const int ARRAY_LEN' в a.cpp, и теперь он работает. Я отредактировал ваш ответ, чтобы включить эту строку и показать полный рабочий код. Благодаря! – cxrodgers