使用指向其字段的指针指定结构的指针

时间:2014-04-08 03:37:53

标签: c embedded-linux uart

struct uart_omap_port *up = (struct uart_omap_port *)port的含义是什么?。

它与container_of宏类似吗?

1 个答案:

答案 0 :(得分:1)

struct uart_omap_port *up = (struct uart_omap_port *)port;

这意味着你的“port”指针变量应该是类型为“struct uart_omap_port”的类型转换。这在C中不是必需的,因为它会隐式地进行类型转换(如果你的端口是void *)。这不是宏它只是(类型转换)具有不同类型的指针。

修改

Linux / drivers / tty / serial / omap-serial.c

中的代码片段
static void serial_omap_enable_ms(struct uart_port *port) {
    .....
    struct uart_omap_port *up = to_uart_omap_port(port);
}


#define to_uart_omap_port(p)    ((container_of((p), struct uart_omap_port, port)))

#define container_of(ptr, type, member) ({                    \
     const typeof(((type *)0)->member)*__mptr = (ptr);    \
     (type *)((char *)__mptr - offsetof(type, member)); })

这是您提到的代码。是的,'to_uart_omap_port'是MACRO 内部使用'container_of'和'offsetof'MACRO。

这是为了使指针'up'而编写的,类型为'struct uart_omap_port' 来自'struct uart_port'类型的指针'port'。这有点复杂,你 需要检查'struct uart_port'和'struct uart_omap_port'是如何声明的。