英文:
Source analysis iw (.handler = (_handler),)
问题
我正在阅读源代码iw,但我卡在这个结构体上。
我不理解这些代码是什么意思?(.handler = (_handler),等等...)
我该如何理解它,或者有没有任何文档可以学习这个。
static struct cmd \
__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden = {\
.name = (_name), \
.args = (_args), \
.cmd = (_nlcmd), \
.nl_msg_flags = (_flags), \
.hidden = (_hidden), \
.idby = (_idby), \
.handler = (_handler), \
.help = (_help), \
.parent = _section, \
.selector = (_sel), \
}; \
<details>
<summary>英文:</summary>
I'm reading the source code [iw](https://github.com/Distrotech/iw) and
I'm stucked in this struct.
I dont't understand what these code mean? (.handler = (_handler), etc...)
How can I understand that or any documents to learn that.
```#define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel)\
static struct cmd \
__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden = {\
.name = (_name), \
.args = (_args), \
.cmd = (_nlcmd), \
.nl_msg_flags = (_flags), \
.hidden = (_hidden), \
.idby = (_idby), \
.handler = (_handler), \
.help = (_help), \
.parent = _section, \
.selector = (_sel), \
}; \
</details>
# 答案1
**得分**: 1
这是一个在静态结构中展开的宏。
如果您查看`iw/iw.h`文件中`cmd`结构的定义,您会看到`handler`成员是一个接受大量参数并返回整数的函数指针。
该宏初始化了结构,将提供的函数地址分配给此指针。现在,`handler`成员可以被用作结构的接口,可以通过它调用提供的函数。
<details>
<summary>英文:</summary>
This is a macro that unfolds in a static structure.
#define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help, _sel)
static struct cmd
__cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden
attribute((used)) attribute((section("__cmd"))) = {
.name = (_name),
.args = (_args),
.cmd = (_nlcmd),
.nl_msg_flags = (_flags),
.hidden = (_hidden),
.idby = (_idby),
.handler = (_handler),
.help = (_help),
.parent = _section,
.selector = (_sel),
}
If you take a look at the definition of `cmd` struct from `iw/iw.h` file, you would see that the `handler` member is a function pointer taking a whole bunch of parameters and returning int.
struct cmd {
const char *name;
const char *args;
const char help;
const enum nl80211_commands cmd;
int nl_msg_flags;
int hidden;
const enum command_identify_by idby;
/
* The handler should return a negative error code,
* zero on success, 1 if the arguments were wrong
* and the usage message should and 2 otherwise.
*/
int (*handler)(struct nl80211_state *state,
struct nl_cb *cb,
struct nl_msg *msg,
int argc, char **argv,
enum id_input id);
const struct cmd *(*selector)(int argc, char **argv);
const struct cmd *parent;
};
The macro initializes the struct assigning the provided function address to this pointer. The `handler` member now can be used as sort of interface for the struct and one may call the provided function via it.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论