任何人都可以解释以下 C 语法吗?

标签 c syntax avr

我遇到了 FAT file system 的库.它是一个用于嵌入式系统的库。在示例代码中,我发现了一些我不理解的有趣行。

这是有问题的行::

sd_protocol.spiHwInit=(void *)atmega_spi_init;

其中 sd_protocol 是一个结构 SdSpiProtocol sd_protocol;

这是类型定义:

struct _SdSpiProtocol
{
    void *spiHwInterface;
    euint8 (*spiHwInit)(void* spiHwInterface);
    euint8 (*spiSendByte)(void* spiHwInterface,euint8 data);
};
typedef struct _SdSpiProtocol SdSpiProtocol;

atmega_spi_init是以下函数:

euint8 atmega_spi_init(atmegaSpiInterface *iface)
{
    euint8 i;

    /* Unselect card */
    PORTB |= iface->pinSelect;

    /* Set as master, clock and chip select output */
    DDR_SPI = (1<<DD_MOSI) | (1<<DD_SCK) | 1;

    /* Enable SPI, master, set clock rate to fck/2 */
    SPCR = (1<<SPE) | (1<<MSTR); /* fsck / 4 */
    SPSR = 1; /* fsck / 2 */

    /* Send 10 spi commands with card not selected */
    for(i=0;i<10;i++)
        atmega_spi_send(iface,0xff);

    /* Select card */
    PORTB &= ~(iface->pinSelect);

    return(0);
}

sd_protocol.spiHwInit=(void *)atmega_spi_init;这不是函数调用,那是什么?

我也不明白这行在类型定义中应该做什么:

euint8 (*spiHwInit)(void* spiHwInterface);

提前致谢!

最佳答案

不是函数调用而是函数指针:

How do function pointers in C work?

并且你的行从一个特定的函数指针转换为一个空指针。

关于任何人都可以解释以下 C 语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27216059/

相关文章:

c - 我如何初始化指针类型结构元素

java - Java 中方法修饰符的顺序

language-agnostic - Map 键和值之间的符号是否有独立于语言的名称?

c - 如何在 C 中对变化的变量(例如计时器)进行快照?

java - 如何将大整数转换为字节

c - 获取整数位数

c - 为什么我的程序只调用一次 while 循环? (爱特梅尔 C)

memory - 在没有 avr-libc 的情况下将数据存储在 RAM 中。如何使用自定义链接器脚本和初始化代码配置正确的内存部分?

c++ - Visual Studio 中将整数显示为位数组的方式

syntax - 在 applescript 中,什么是 "application process"?