Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

указатели в sendmail milter

17K
16 июня 2007 года
smn
3 / / 15.06.2006
Сразу говорю что новичок и прошу сильно ну критиковать а помочь :-)
Хочу разобраться с milter sendmail начал читать пример котрый приведен с исходным кодом, там есть такие строки

struct mlfiPriv // это понятно что объявляется структура.
{
char *mlfi_fname;
FILE *mlfi_fp;
};

// А вот тут не могу разобраться
#define MLFIPRIV ((struct mlfiPriv *) smfi_getpriv(ctx))
Может кто подскажет ???
24K
16 июня 2007 года
>DiN<
38 / / 08.06.2007
#define идентификатор текст-замены

Директива #define заменяет все появления "идентификатор" в исходном файле на "текст-замены". Идентификатор заменяется только тогда, когда он формирует лексему. Например, идентификатор не будет заменен, если он появляется в строке или как часть более длинного идентификатора.
17K
17 июня 2007 года
smn
3 / / 15.06.2006
понятно. А эту чать как понять ((struct mlfiPriv *) smfi_getpriv(ctx)) ?
24K
17 июня 2007 года
>DiN<
38 / / 08.06.2007
Ну, просто все слова MLFIPRIV заменяются на ((struct mlfiPriv *) smfi_getpriv(ctx)), а что это означает в конкретном случае, я понятия не имею.
63
18 июня 2007 года
Zorkus
2.6K / / 04.11.2006
[QUOTE=>DiN<;198049]Ну, просто все слова MLFIPRIV заменяются на ((struct mlfiPriv *) smfi_getpriv(ctx)), а что это означает в конкретном случае, я понятия не имею.[/QUOTE]
Это обычный макрос. Я так понимаю, автор использует пример, подобный этому - http://www.sendmail.org/doc/sendmail-current/libmilter/docs/sample.html. Читаем описание функции smfi_getpriv.
Цитата:

SYNOPSIS #include <libmilter/mfapi.h>
void* smfi_getpriv(
SMFICTX *ctx
);
Get the connection-specific data pointer for this connection.
DESCRIPTION Called When smfi_getpriv may be called in any of the xxfi_* callbacks.
Effects None.

ARGUMENTS Argument Description
ctx Opaque context structure.

RETURN VALUES smfi_getpriv returns the private data pointer stored by a prior call to smfi_setpriv, or NULL if none has been set.


Сравнивая сигнатуру функции с определением макроса, понимаем - функция возвращает неудобный тип void *. И нам бы пришлось все время явно приводить его к нужному типу в каждом конкретном случае. Но раз мы используем эту функцию только для получения структуры mlfiPriv *, то мы пишем макрос, выполняющий нужный даункастинг, и в дальнейшем пользуемся не "сырой" функцией, а макросом - оболочкой.
C не меньшим успехом мы могли бы написать функцию-оболочку ("wrapper") вида:

 
Код:
mlfiPriv * MLFIPRIV (SMFICTX *ctx)
{
    return (mlfiPriv *) smfi_getpriv(ctx);
}

Но автор примера использут C-style, предпочитая макросы. Однако лучше везде, где возможно, заменять макросы функциями (IMHO).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог