使用C预处理器生成随机数

Xof*_*ofo 10 random c-preprocessor

我想使用C预处理器生成一个随机数或字符串...嗯...我甚至不知道这是否可行,但我正在尝试动态创建变量(字符串在这里会很有用)和为它们分配值(整数).所以我尝试做了一些事情,但基本问题仍然存在 - 我可以使用预处理器创建一个随机字符串或数字.

ner*_*eia 17

基于 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

247524236
3009541994
1129205949
Run Code Online (Sandbox Code Playgroud)

  • 这是误导性的,因为它没有按照 OP 的要求使用预处理器来计算随机数。相反,它插入了一个 C 代码块,该代码块将被编译成计算数字的代码。 (2认同)

Jen*_*edt 13

我想你想要通过预处理器创建唯一标识符令牌的方法.

gcc有一个被调用的扩展名,__COUNTER__并按照你的名字做你所期望的.您可以将其与宏连接组合##以获取唯一标识符.

如果你有C99编译器,你可以使用P99.它有宏P99_LINEID和称为P99_FILEID.它们可以用作

#include "p99_id.h"

P99_LINEID(some, other, tokens, to, make, it, unique, on, the, line)
Run Code Online (Sandbox Code Playgroud)

和类似的P99_FILEID.

第一个修改了令牌中的名称和行号以及取决于文件"p99_id.h"被包含的次数的散列.第二个宏只使用该哈希而不是行号,以便名称可以在同一编译单元内的多个位置重现.

这两个宏也有同行P99_LINENOP99_FILENO刚刚产生大量而不是标识符标记.

  • 不是那个扩展名`__ COUNTER__`?https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html (2认同)