Оператор ->
делает код более читабельным, чем оператор *
в некоторых ситуациях.
Например: (цитируется по проекту EDK II )
typedef
EFI_STATUS
(EFIAPI *EFI_BLOCK_READ)(
IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId,
IN EFI_LBA Lba,
IN UINTN BufferSize,
OUT VOID *Buffer
);
struct _EFI_BLOCK_IO_PROTOCOL {
///
/// The revision to which the block IO interface adheres. All future
/// revisions must be backwards compatible. If a future version is not
/// back wards compatible, it is not the same GUID.
///
UINT64 Revision;
///
/// Pointer to the EFI_BLOCK_IO_MEDIA data for this device.
///
EFI_BLOCK_IO_MEDIA *Media;
EFI_BLOCK_RESET Reset;
EFI_BLOCK_READ ReadBlocks;
EFI_BLOCK_WRITE WriteBlocks;
EFI_BLOCK_FLUSH FlushBlocks;
};
Структура _EFI_BLOCK_IO_PROTOCOL
содержит 4 члена указателя функции.
Предположим, у вас есть переменная struct _EFI_BLOCK_IO_PROTOCOL * pStruct
, и вы хотите использовать старый добрый оператор *
для вызова указателя на функцию-член. В итоге вы получите такой код:
(*pStruct).ReadBlocks(...arguments...)
Но с помощью оператора ->
вы можете написать так:
pStruct->ReadBlocks(...arguments...)
.
Что выглядит лучше?