使用 strcmp 取消引用指向不完整类型错误的指针 [关闭]
Posted
技术标签:
【中文标题】使用 strcmp 取消引用指向不完整类型错误的指针 [关闭]【英文标题】:dereferencing pointer to incomplete type error using strcmp [closed] 【发布时间】:2019-05-01 18:22:43 【问题描述】:我尝试使用 strcmp。在 Win32 C 项目中一切正常,当我尝试在 Eclipse Mars Atmel Avr 工具链中编译这段代码时,编译失败。
使用strcmp编译错误:
解除指向不完整类型的指针
struct Command
char* address;
char* cmd;
;
struct Command* parsedCommand = ParseCommand(PCmd); //PCmd - char*
if(parsedCommand != NULL)
if(strcmp(ADRES, *parsedCommand ->address) == 0)
【问题讨论】:
编译时得到的确切的错误信息是什么?你有#include
strcmp
的标题吗?
*parsedCommand ->address
--> parsedCommand->address
错误dereferencing pointer to incomplete type
。我包括stdlib.h
和stdio.h
。在 WIn32 Target 中编译 ok。
ADRES
是如何定义的?
char ADRES[] = "123";
【参考方案1】:
问题是您既要取消引用 parsedCommand
又要使用箭头符号来访问地址。
改变
*parsedCommand ->address
到任一
parsedCommand->address
或
(*parsedCommand).address
【讨论】:
这行不通。我使用 Atmel Avr Toolchain 为 atmega 微处理器编译 hec。 @lgabryel 我不明白你反对这个答案。使用 Atmel Avr 工具链无法正常工作怎么办? 我按照您的建议更改了代码,但我遇到了同样的编译错误。 编译器会给你一个行号吗?strcmp
没有任何问题。编译器抱怨结构的使用。不知道为什么它会抱怨取消引用,因为您使用 struct Command
声明了它
编译给if(strcmp(ADRES, *parsedCommand ->address) == 0)
的行【参考方案2】:
我缺乏必要的评论声誉,所以我会暂时发布这个作为答案,然后酌情删除/编辑。我怀疑你的简短代码清单遗漏了一些关于在哪里的信息声明了结构以及有问题的代码所在的位置。它们是在同一个文件中,还是在不同的文件中?哪些文件包括哪些其他文件?为什么我想知道?因为下面的代码会给你类似的编译错误:
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
的含义。
这是否适用于您,或者我完全错过了这里的标记?如果是这样,将完整的结构声明移动到包含在所有使用该结构的源文件中的头文件中应该可以解决问题。
【讨论】:
【参考方案3】:我没有包括命令结构的定义。当我包含结构的定义时,一切都很好。
【讨论】:
以上是关于使用 strcmp 取消引用指向不完整类型错误的指针 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章