c - 在 main 之前进行重要初始化的最优雅的方法是什么?

标签 c initialization runtime

我不是很喜欢 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() 函数以避免不必要的、晦涩的代码。

正如我所说,我的工作与素数无关;这只是一个具有相同挑战的示例。

最好的问候。

最佳答案

使用 init 函数是正确的方法。不要忘记添加一个 fini 函数,这样人们就可以根据需要释放内存(不知道你的库做了什么,这可能重要也可能不重要,但通常能够释放所有内存 - 例如,当可加载模块使用库时,它通常不希望在卸载时泄漏内存)。

关于c - 在 main 之前进行重要初始化的最优雅的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7869779/

相关文章:

c++ - 'int [0]' c++ 的初始化程序太多

database - 在 django 中生成用于开发的数据

mysql - 无法从C程序连接到mysql套接字

c - 哪种数据结构在共享内存场景和快速查找中效果最好

c - 使用列表定义内的数组创建链接列表时出错

c++ - 我尝试创建临时对象的方式是否有任何错误

java - 将 String 转换为 java 中的运行时代码

c++ - 如何使 Windows 上的 Clang 链接到不同的运行时

c++ - 控制和分析内存和时间消耗 C++ Windows 应用程序?

c - 在 C 代码中带有管道的 linux 终端命令