我有一个应用程序,它在用户和后端之间严格分开。用户与我的后端进行交互的唯一方法是通过一个功能。要指定用户希望此功能的第一个参数是用户希望后端执行的指令(例如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
...
我想将这些定义随机化,并且每个定义都有唯一的编号。
答案 0 :(得分:4)
在程序启动时随机分配#define
不可能。预处理器宏在预处理时扩展,而预处理在编译前发生,而程序在启动前发生。
您需要的是一个变量。当然,您可以定义一个宏以扩展为变量名,但这与直接使用变量没有太大的优势。
我在编译时收到一条错误消息,指出该值具有多个定义。
更准确地说,该错误消息是链接后的,这是在编译之后。
必须在标头中声明变量extern
。然后,仅在一个转换单元中定义变量(不带extern
)。注意不要在初始化之前使用该值,否则会得到零而不是随机值。