2015-09-25 26 views
0

我的程序包含一个使用rand()的功能。该函数将被多次调用,所以我不能在函数的开头放置srand()。现在,是否有一条通用规则,建议srand()应放在函数的头文件中,还是放在主函数的开头?将srand()放在头文件中是个好主意吗?

我的理解是两者的工作原理都是一样的。唯一的区别是,如果我想在未来重用该功能,在头文件中使用srand()会使该函数更独立,但我最终可能会得到多个头文件,所有头文件都有srand()

- 编辑 -

是的,我的意思是这样

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

所以它不会工作?

+1

头文件不应包含可执行代码。只是函数定义。 –

+0

如果你想用一组可预测的随机数做一些测试,会发生什么?将'srand()'放在标题中将会使其变得不可能。 – Barmar

+0

“把srand放到头文件中”是什么意思?你可以添加代码片段显示相关部分,如果头部? – hyde

回答

4

现在,有没有建议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调用中将始终获得相同的值序列。

3

一般来说,图书馆不应该叫srand。致电srand应该进行一次,通常在main,并且是应用程序的责任。

任何其他解决方案都以多个库相互竞争而告终。

使用涉及随机数的库的应用程序应该以适合应用程序的任何方式对随机数生成器进行播种(例如,库不知道的其他东西:例如,如果应用程序需要可重现,该怎么办) 。

1

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

+0

“* srand会冗余执行*”它不会,因为代码甚至不会编译一个独立的函数。 – alk

+0

有几种方法来包装它。 –

+0

即使它*被封装,每次包含标题时都不会自动调用。 – alk

相关问题