使用 strcmp 取消引用指向不完整类型错误的指针

dereferencing pointer to incomplete type error using strcmp

我尝试使用 strcmp。在 Win32 C 项目中所有工作,当我尝试在 Eclipse Mars Atmel Avr 工具链中编译此代码时,编译失败。

使用strcmp编译错误:

dereferencing pointer to incomplete type

struct Command{
    char* address;
    char* cmd; 
 };

 struct Command* parsedCommand = ParseCommand(PCmd); //PCmd - char* 
 if(parsedCommand != NULL)
 {
     if(strcmp(ADRES, *parsedCommand ->address) == 0)

问题是您既要取消引用 parsedCommand 又要使用箭头符号来访问地址。

改变

*parsedCommand ->address

要么

parsedCommand->address

(*parsedCommand).address

我没有包括命令结构的定义。当我包含结构的定义时,一切都很好。

我缺乏发表评论的必要声望,所以我暂时post将此作为答案,然后delete/edit视情况而定。我怀疑您的简短代码清单遗漏了一些有关声明结构的位置以及有问题的代码所在位置的信息。它们在同一个文件中,还是不同的文件中?哪些文件包含哪些其他文件?我为什么想知道?因为下面的代码会给你类似的编译错误:

parsecmd.c:

#include <stdlib.h>

struct command {
    char *addr;
    char *cmd;
};

struct command *
parse_command(char *str)
{
    struct command *ret = malloc(sizeof *ret);
    if (ret == 0) return 0;
    ret->addr = ....
    ret->cmd = ....
    return ret;
}

main.c:

#include <string.h>

struct command *parse_command(char *str);

int
main(void)
{
    ...
    struct command *cmd = parse_command(pcmd);

    if (cmd != 0) {
        if (strcmp(address, cmd->addr) == 0) ... 
    }     
}

编译main.c时,编译器不知道结构的任何完整声明,这就是它被称为不完整类型的原因。它也不知道结构有哪些字段(甚至它的大小),所以它不知道表达式 cmd->addr 的含义。

这是否适用于您,还是我完全没有抓住重点?如果是这样,将完整的结构声明移动到头文件中,该头文件包含在使用该结构的所有源文件中应该可以解决问题。