我想使用 C 预处理器生成一个随机数或字符串...嗯...我甚至不知道这是否可行,但我试图创建变量fly(字符串在这里会很有用)并为它们赋值(整数)。所以我想尝试一些事情,但基本问题仍然存在 - 我可以使用预处理器创建一个随机字符串或数字。
答案 0 :(得分:16)
基于1999-01-15 Jeff Stout(感谢@ rlb.usa)
#define UL unsigned long
#define znew ((z=36969*(z&65535)+(z>>16))<<16)
#define wnew ((w=18000*(w&65535)+(w>>16))&65535)
#define MWC (znew+wnew)
#define SHR3 (jsr=(jsr=(jsr=jsr^(jsr<<17))^(jsr>>13))^(jsr<<5))
#define CONG (jcong=69069*jcong+1234567)
#define KISS ((MWC^CONG)+SHR3)
/* Global static variables:
(the seed changes on every minute) */
static UL z=362436069*(int)__TIMESTAMP__, w=521288629*(int)__TIMESTAMP__, \
jsr=123456789*(int)__TIMESTAMP__, jcong=380116160*(int)__TIMESTAMP__;
int main(int argc, _TCHAR* argv[]){
cout<<KISS<<endl;
cout<<KISS<<endl;
cout<<KISS<<endl;
}
输出:
247524236
3009541994
1129205949
答案 1 :(得分:12)
我提出你想要通过预处理器创建唯一标识符令牌的方法。
gcc有一个名为__COUNTER__
的扩展名,可以根据您的名字进行操作。您可以将其与宏连接##
结合使用,以获取唯一标识符。
如果您有C99编译器,则可以使用P99。它有一个名为P99_LINEID
和P99_FILEID
的宏。它们可以用作
#include "p99_id.h"
P99_LINEID(some, other, tokens, to, make, it, unique, on, the, line)
和P99_FILEID
类似。
第一个修改了令牌中的名称和行号以及取决于文件“p99_id.h”被包含的次数的散列。第二个宏只使用该哈希而不是行号,以便名称可以在同一编译单元内的多个位置重现。
这两个宏也有对应的P99_LINENO
和P99_FILENO
只能生成大数而不是标识符令牌。
答案 2 :(得分:-7)
不要在C中这样做。你最终会让人感到困惑。如果您需要动态创建变量,请使用malloc
和realloc
并维护其值的数组。
要回答你的问题,不。预处理器不包括随机数生成器。您可以在运行时生成随机数(使用rand()
),但如果您在编译时确实需要它们,则必须编写自己的预处理器并通过它运行代码。或者你可以使用4,这是由一个公平的100面模具随机确定的。