Статический массив - где я должен его определить? - PullRequest
0 голосов
/ 01 мая 2019

Я определил следующий статический массив const:

const int arr[197] = { 55, -63, 12, -17, 121 , ... };

Массив никогда не изменяется.Он содержит определенный числовой шаблон, подходящий для моей программы.Этот массив используется в трех разных файлах:

  • foo1() в file1.c
  • foo2() в file2.c
  • foo3() в file3.c

каждый раз, передавая массив функции в качестве аргумента.

Поскольку определение этого массива довольно длинное и обширное, я хочу создать отдельный файл только для определения и сохраненияэтот массив там.

Как это должно быть сделано правильно?Должен ли я определить этот массив, скажем, arr.h, а затем поместить #include <arr.h> в .c файлы, которые используют этот массив?

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Я не могу комментировать принятый ответ (newb), поэтому вот несколько способов определить массив один раз, но не как глобальную переменную:

  1. Уродливый: определить массив вarr.h, затем в foo1/2/3(), просто #include "arr.h" (внутри тела функции).
// arr.h
const int arr[197] = { 55, -63, 12, -17, 121 , ... };

// file1.c
void foo1()
{
#include "arr.h"
    // Use arr like a local variable
}
Менее уродливый, но все же довольно уродливый: определите arr в arr.h, но включите только в main.Затем передайте arr в качестве аргумента foo1/2/3
int main()
{
#include "arr.h"
    foo1(arr);
    foo2(arr);
    foo3(arr);
}
Учебник:
// arr_init.c
void init_arr(int arr[197])
{
    const int src_arr[197] = {55, -63, 12, -17, 121 , ...};
    memcpy(arr, src_arr, sizeof(src_arr));
}

// arr_init.h
extern void init_arr(int arr[197]);

// main.c
#include "init_arr.h"
int main()
{
    int arr[197];
    init_arr(arr);
    foo1(arr);
    foo2(arr);
    foo3(arr);
}

// file1.c
void foo1(const int arr[197])
{
...
}

...
Лучше: используйте глобальный констант как @ chux сказал .
1 голос
/ 01 мая 2019

Определить const int arr[197] = ... в arr.c.

Объявить extern const int arr[197]; в arr.h

Включить только 1013 * вarr.c, file1.c, file2.c, file3.c с #include "arr.h", а не #include <arr.h> почти как @ weno

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...