Я пытаюсь понять какой-то код, который мне дали.Он работает аналогично pthread_create
: вы передаете ему указатель на функцию start_routine
, которая принимает указатель на void arg
в качестве единственного аргумента, и сам указатель на аргумент, а затем pthread_create
вызывает вашу функцию.
Обычно, если start_routine
действительно нужен аргумент, ему не нужен void *
, а arg
должен быть приведен к указателю на некоторую структуру.Раньше я кодировал свои start_routine
вот так:
void *my_start_routine(void *arg)
{
struct my_struct *p = arg;
// use p many times
}
Однако я только что получил код, в котором автор устанавливает макрос для выполнения приведения при каждом использовании p
:
void *my_start_routine(void *arg)
{
#define p ((struct my_struct *) arg)
// use p many times
#undef p
}
Мне трудно понять, почему вы хотите это сделать.Но я предполагаю, что это преднамеренно, потому что это кажется более сложным и менее очевидным, чем первый способ, и автор использует подобные идиомы в коде.Есть ли какая-то причина, производительность или нет, отдавать предпочтение макросу здесь?