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

问题描述 投票:-1回答:3

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

使用strcmp编译错误:

取消引用指向不完整类型的指针

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

 struct Command* parsedCommand = ParseCommand(PCmd); //PCmd - char* 
 if(parsedCommand != NULL)
 {
     if(strcmp(ADRES, *parsedCommand ->address) == 0)
c avr strcmp atmel
3个回答
1
投票

我缺乏必要的评论声誉,所以我会暂时将其作为答案发布,然后根据需要删除/编辑。我怀疑您的简短代码清单中遗漏了一些有关声明结构的位置以及有问题的代码所在位置的信息。它们是在同一个文件中,还是在不同的文件中?哪些文件包含哪些其他文件?我为什么想知道?因为以下代码会给您一个类似的编译错误:

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

这适用于您,还是我完全错过了这里的标记?如果是这样,将完整的struct声明移动到头文件中,该头文件包含在使用该结构的所有源文件中都应解决问题。


1
投票

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

更改

*parsedCommand ->address

要么

parsedCommand->address

要么

(*parsedCommand).address

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.