Я не очень люблю шаблоны проектирования C, поэтому мои сомнения потенциально просты (хотя и немного конкретны).
Реальное применение этого вопроса объяснить сложнее, поэтому позвольте мне упростить его.
Предположим, у меня есть массив, в котором я хочу хранить простые числа. Число простых чисел, содержащихся в этом массиве, определяется как NUMBER_OF_PRIMES
, константа, определенная во время компиляции.
Таким образом, имеем:
unsigned primes[NUMBER_OF_PRIMES];
Если размер был зафиксирован, я мог бы предварительно вычислить простые числа и инициализировать массив как обычно:
unsigned primes[NUMBER_OF_PRIMES] = { 2, 3, 5, 7, ... };
Но это было бы довольно уродливо, если бы NUMBER_OF_PRIMES
было, скажем, больше 200. Я хочу каким-то образом запустить функцию во время выполнения, но перед main (), которая поместит эти числа простых чисел туда. Конечно, я мог бы сделать:
unsigned* primes = make_primes(NUMBER_OF_PRIMES);
, который выделит необходимую память и будет запущен перед main. Основная проблема заключается в том, что этот массив будет находиться в заголовочном файле, но его значение будет содержать что-то, что скрыто внутри соответствующего файла .c. то, что я думал, что мог сделать, это:
/* Header file */
unsigned primes[NUMBER_OF_PRIMES];
/* C file */
int nothing = initialize_primes(); /* This function would write the
values to the array, using things that are not available in the
header (it is in the .c, so it can reference them), and return anything */
Другой способ - это, очевидно, поместить initialize_primes()
в заголовочный файл и попросить пользователя вызвать его внутри основной функции (например, функции init()
некоторых библиотек). Однако я бы не хотел, чтобы main()
содержал вызов этой функции.
У меня вопрос: есть ли какой-нибудь элегантный способ сделать это, который общепризнан / используется, или если это смешно, и я должен попросить main()
вызвать функцию init()
, чтобы избежать ненужного, неясного кода.
Как я уже сказал, я не работаю ни с чем, связанным с простыми числами; это просто пример с той же проблемой.
С наилучшими пожеланиями.