Я пытаюсь решить, следует ли выполнять определенные операции как макросы или как функции.globals, код повторного входа и безопасность потоков
Скажем, только в качестве примера, у меня есть следующий код в файле заголовка:
extern int x_GLOB;
extern int y_GLOB;
#define min(x,y) ((x_GLOB = (x)) < (y_GLOB = (y))? x_GLOB : y_GLOB)
намерение состоит в том, чтобы каждый отдельный аргумент, вычисленный только один раз (min(x++,y++)
не вызовет никаких проблем здесь).
Вопрос заключается в следующем: выполняют ли две глобальные переменные какие-либо проблемы с точки зрения повторного ввода кода или безопасности потоков?
Я бы сказал нет, но я не уверен.
А что:
#define min(x,y) ((x_GLOB = (x)), \
(y_GLOB = (y)), \
((x_GLOB < y_GLOB) ? x_GLOB : y_GLOB)
бы это быть различный случай?
Обратите внимание, что вопрос не является «вообще», а связан с тем фактом, что эти глобальные переменные используются только внутри этого макроса и для оценки одного выражения.
Во всяком случае, глядя на ответы на приведенные ниже, я думаю, можно резюмировать следующим образом:
Это не поточно, как ничто не гарантирует, что поток приостановлен «в середине» оценки выражения (как я и надеялся)
«Состояние» этих глобальных символов представляет собой, по крайней мере, внутреннее состояние операции «мин» и сохранение этого состояния, по крайней мере, потребовало бы накладывать ограничения на то, как функция можно назвать (например, избегать мин (мин (1,2), мин (3,1)).
Я не думаю, что использование не переносных конструкций является хорошей идеей, так что, я думаю, единственный вариант - оставаться на безопасной стороне в тех случаях, когда это обычные функции.
Как будет оцениваться min (min (a, b), min (c, d))? –
Точка взята! Использование глобалов потребовало бы постановки ограничения на то, как эта «функция» должна использоваться. Чанки –