我碰到了这个宏定义。
#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);"
答案 0 :(得分:1)
宏只是命名的文本片段。因此,在通过预处理器进行实际编译之前,它们只是被其内容替换。所以在你的情况下调用函数
command_context_mode(CMD_CTX,
将替换为
command_context_mode((cmd->ctx),
请注意'('和')'从宏定义也将在这里。 我故意没有向调用显示第二个参数,因为它看起来像是另一个没有提供定义的宏。
因此,宏不需要知道关于类型的任何信息,因为它们只替换文本。但是编译器会在替换发生后检查类型匹配。
恕我直言,这种类型的宏使用只会使程序更难以阅读和更混乱(就像它为你做的那样)。不要使用它。