Рандомизировать #define при запуске программы - PullRequest
1 голос
/ 17 июня 2019

У меня есть приложение, которое строго разделяет пользователя и серверную часть. Единственный способ, которым пользователь может взаимодействовать с моим бэкэндом, - это одна функция. Чтобы указать, что пользователь хочет, первым аргументом этой функции является инструкция, которую пользователь хочет, чтобы бэкэнд выполнял (например, getData). Это выглядит примерно так

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

Имена сервисов, которые предоставляет мой бэкэнд, сохраняются в файле .h (называемом определениями .h). Этот файл содержит только # define.

#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 Ответ

4 голосов
/ 17 июня 2019

Произвести рандомизацию #define при запуске программы

Невозможно.Макросы препроцессора раскрываются во время предварительной обработки, которое происходит перед компиляцией, которая происходит перед запуском программы.

Вам нужна переменная.Конечно, вы можете определить макрос для расширения до имени переменной, но это не имеет большого преимущества от непосредственного использования переменной.

При компиляции появляется сообщение об ошибке, что это значение имеет несколько определений.

Точнее, сообщение об ошибке при связывании, которое происходит после компиляции.

Вы должны объявить переменную extern в заголовке.Затем ровно в одной единице перевода определите переменную (без extern).Будьте осторожны, не пытайтесь использовать значение до его инициализации, иначе вместо случайного значения вы получите ноль.

...