【问题标题】:Is it a good idea to put srand() in the header file?将 srand() 放在头文件中是个好主意吗?
【发布时间】:2015-09-25 18:55:43
【问题描述】:

我的程序包含一个使用rand() 的函数。该函数将被多次调用,因此我不能将srand() 放在函数的开头。现在,有没有一个通用的规则建议srand()应该放在函数的头文件中,还是放在主函数的开头?

我的理解是两者的工作方式相同。唯一的区别是,如果我想在将来重用该函数,在标头中包含 srand() 会使函数更加独立,但我最终可能会得到多个标头都包含 srand()

--编辑--

是的,我的意思是这样的

/*header.h*/
srand();
void my_funciton();

这样就不行了?

【问题讨论】:

  • 头文件不应包含可执行代码。只是函数定义。
  • 如果你想用一组可预测的随机数做一些测试会发生什么?将srand() 放在标题中将使这成为不可能。
  • “将 srand 放入头文件”是什么意思?如果标题,您可以添加代码 sn-p 显示相关部分吗?
  • @MarcB 标头中的可执行代码不一定是坏的。甚至还有 C 关键字 inline 用于在头文件中包含函数定义(而不仅仅是声明,我假设你的意思是)。
  • @hyde - 但是标题中的代码不会因为#included而被执行;我认为这就是 OP 所希望的。

标签: c header-files srand


【解决方案1】:

现在,是否有一个通用规则建议是否应将 srand() 放入函数的头文件中

如果你的意思是这样的

/**
 * foo.h
 */
 srand();

 void my_function_that_uses_rand();

这不会导致 srand 被包含头文件的任何内容调用;它将被视为旧式隐式 int 函数声明(它不适用于 C99 或更高版本的编译器,因为不再支持隐式 int 函数声明),这将导致其他如果您在包含此文件的任何文件中包含math.h,则会出现问题。

编辑

实际上,比这更糟糕,因为对srand调用 需要种子参数,所以如果你想按时随机化,你的头文件看起来像

/**
 * foo.h
 */
srand(time(NULL));

void my_function_that_uses_rand();

编译器会立即使用它,因为 srand(time(NULL)); 首先不是一个有效的声明。

srand 应该在第一次调用rand 之前调用一次,这取决于应用程序代码。请注意,如果您始终使用相同的种子值调用 srand,您将始终在您的 rand 调用中获得相同的值序列。

【讨论】:

    【解决方案2】:

    一般来说,库不应该调用srand。对srand 的调用应进行一次,通常在main 中,由应用程序负责。

    任何其他解决方案都会导致多个库相互竞争。

    使用包含随机数的库的应用程序应该以任何似乎适合应用程序的方式为随机数生成器播种(库不知道的其他内容:例如,如果应用程序需要可重现怎么办)。

    【讨论】:

      【解决方案3】:

      标头旨在可重用。如果您的标头在多个源文件中使用,则 srand 将在意外时间再次冗余执行。把它放在 main() 或任何地方,只调用一次。

      【讨论】:

      • srand 将被冗余执行”它不会,因为代码甚至不会编译对函数的独立调用。
      • 有办法把它包起来。
      • 即使它 包装,它也不会在每次包含标头时自动被调用。
      • 这个人被认为在包含期间做出了积极的努力来执行。我认为static int dummy = srand(...), 0; 会起作用。为什么还要问这个问题?
      • 对于... = srand(),它不会,至少在 C 中不会。对不起,但这正是我拒绝你的答案的原因,正如你所猜测的那样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多