Какой самый элегантный способ выполнить нетривиальную инициализацию перед main?

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

Как я уже сказал, я не работаю ни с чем, связанным с простыми числами; это просто пример с той же проблемой.

С уважением.

5
задан Gabriel 23 October 2011 в 22:42
поделиться