将 srand() 放在 header 文件中是个好主意吗?
Is it a good idea to put srand() in the header file?
我的程序包含一个使用 rand()
的函数。该函数将被多次调用,因此我不能将 srand()
放在函数的开头。现在,是否有一般规则建议 srand()
应该放在函数的 header 文件中,还是放在 main 函数的开头?
我的理解是两者的工作原理相同。唯一的区别是,如果我想在将来重用该函数,在 header 中包含 srand()
会使该函数更多 self-contained,但我最终可能会得到多个 header 都有 srand()
.
--编辑--
是的,我的意思是
/*header.h*/
srand();
void my_funciton();
所以它不会起作用?
一般来说,图书馆不应该调用 srand
。对 srand
的调用应该进行一次,通常在 main
中,并且是应用程序的责任。
任何其他解决方案最终都会导致多个库相互竞争。
使用涉及随机数的库的应用程序应该以适合该应用程序的任何方式为随机数生成器播种(库不知道的其他内容:例如,如果应用程序需要可重现怎么办? ).
Headers 旨在可重复使用。如果您的 header 在多个源文件中使用,srand 将在意想不到的时间再次重复执行。把它放在 main() 或任何地方,只调用一次。
Now, is there a general rule that suggests whether srand() should be put in the header file of the function
如果你的意思是
/**
* 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
调用中获得相同的值序列。
我的程序包含一个使用 rand()
的函数。该函数将被多次调用,因此我不能将 srand()
放在函数的开头。现在,是否有一般规则建议 srand()
应该放在函数的 header 文件中,还是放在 main 函数的开头?
我的理解是两者的工作原理相同。唯一的区别是,如果我想在将来重用该函数,在 header 中包含 srand()
会使该函数更多 self-contained,但我最终可能会得到多个 header 都有 srand()
.
--编辑--
是的,我的意思是
/*header.h*/
srand();
void my_funciton();
所以它不会起作用?
一般来说,图书馆不应该调用 srand
。对 srand
的调用应该进行一次,通常在 main
中,并且是应用程序的责任。
任何其他解决方案最终都会导致多个库相互竞争。
使用涉及随机数的库的应用程序应该以适合该应用程序的任何方式为随机数生成器播种(库不知道的其他内容:例如,如果应用程序需要可重现怎么办? ).
Headers 旨在可重复使用。如果您的 header 在多个源文件中使用,srand 将在意想不到的时间再次重复执行。把它放在 main() 或任何地方,只调用一次。
Now, is there a general rule that suggests whether srand() should be put in the header file of the function
如果你的意思是
/**
* 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
调用中获得相同的值序列。