宏访问没有类型定义的struct成员

时间:2017-09-12 00:57:59

标签: c struct macros

我碰到了这个宏定义。

#define CMD_CTX (cmd->ctx)

我了解它的功能。它试图访问该成员&#ctx'来自struct' command_invocation'在以下代码段中。我知道因为' command_invocation'是唯一具有&#c; ctx'我的代码中的成员。令人困惑的是为什么没有提到输入参数的类型。

struct command_invocation {
    struct command_context *ctx;
    struct command *current;
    const char *name;
    unsigned argc;
    const char **argv;
};

现在CMD_CTX的调用如下

command_context_mode(CMD_CTX, COMMAND_EXEC);

并且该函数的定义是

int command_context_mode(struct command_context *cmd_ctx, enum command_mode mode)

我理解返回值匹配。但是我在这里不清楚的是如何在这个调用中确定输入参数" command_context_mode(CMD_CTX,COMMAND_EXEC);"

1 个答案:

答案 0 :(得分:1)

宏只是命名的文本片段。因此,在通过预处理器进行实际编译之前,它们只是被其内容替换。所以在你的情况下调用函数

command_context_mode(CMD_CTX, 

将替换为

command_context_mode((cmd->ctx), 

请注意'('和')'从宏定义也将在这里。 我故意没有向调用显示第二个参数,因为它看起来像是另一个没有提供定义的宏。

因此,宏不需要知道关于类型的任何信息,因为它们只替换文本。但是编译器会在替换发生后检查类型匹配。

恕我直言,这种类型的宏使用只会使程序更难以阅读和更混乱(就像它为你做的那样)。不要使用它。