在程序启动时随机分配#define

时间:2019-06-17 13:09:04

标签: c random

我有一个应用程序,它在用户和后端之间严格分开。用户与我的后端进行交互的唯一方法是通过一个功能。要指定用户希望此功能的第一个参数是用户希望后端执行的指令(例如getData)。看起来像这样

backendcall(getData, arg1, arg2, arg3, arg4)

我的后端提供的服务的名称保存在一个.h文件(称为definitions.h)中。该文件仅包含#defines。

#define getData 1
#define setData 2
...

这样,用户可以更轻松地进行后端呼叫。 出于安全原因,我想在开始时将#defines的值随机化。

我知道可以在这样的定义中调用函数 #define var foo()

我的问题是,这对我不起作用,因为我无法使用函数来定义随机值。 即使我添加这样的整数

int asdfqweryxcv = 20;

我在编译时收到一条错误消息,指出该值具有多个定义。我可以将名称更改为任何我想要的结果。

错误消息如下:

../../lib.a(userfile1.c.o):/home/../../../definitions.h:8: multiple definition of `asdfqweryxcv'
CMakeFiles/mult.c.o:/home/../../../definitions.h:8: first defined here

../../lib.a(userfile2.c.o):/home/../../../definitions.h:8: multiple definition of `asdfqweryxcv'
CMakeFiles/mult.c.o:/home/../../../definitions.h:8: first defined here

...

我想将这些定义随机化,并且每个定义都有唯一的编号。

1 个答案:

答案 0 :(得分:4)

  

在程序启动时随机分配#define

不可能。预处理器宏在预处理时扩展,而预处理在编译前发生,而程序在启动前发生。

您需要的是一个变量。当然,您可以定义一个宏以扩展为变量名,但这与直接使用变量没有太大的优势。

  

我在编译时收到一条错误消息,指出该值具有多个定义。

更准确地说,该错误消息是链接后的,这是在编译之后。

必须在标头中声明变量extern。然后,仅在一个转换单元中定义变量(不带extern)。注意不要在初始化之前使用该值,否则会得到零而不是随机值。