是否可以在不知道类型的情况下使用ty胡枝子结构?
例如,在另一个嵌入式微控制器上有一个模块,它需要一个struct,并且该结构是从另一个板发送的,而struct是ty胡枝子结构。是否可以访问预期的结构。它的数据能被读取吗?
出现的另一个问题是,结构通常是如何在系统中发送的,使用它们的开发人员需要知道structs字段。
声明它们的模块是否包括在内,开发人员需要找出字段吗?
结构数据可以在不知道其字段的情况下访问吗?
发布于 2011-05-02 19:37:11
如果结构类型不完整,则不应访问其数据。但是,您可以传递指向该类型的指针,知道结构的完整类型的代码可以访问指针指向的数据。
如果要在两个不同的模块中操作结构的数据,则需要在这两个模块中都有完整的类型声明。这通常被放入一个头文件中。
mystruct.h
#ifndef _MYSTRUCT_H
#define _MYSTRUCT_H
typedef struct mystruct{
int a;
int b;
} mystruct;
#endiffoo.c
#include "mystruct.h"
int foo(mystruct m){
return m.a;
}bar.c
#include "mystruct.h"
int bar(mystruct m){
return m.b;
}发布于 2011-05-02 19:43:06
要访问struct的任何字段(不管它是否经过typedef编辑),必须在代码试图访问字段的地方看到struct的完整声明。哪个物理板产生的数据是完全无关的。
“完整声明”和“可见”是具有精确定义的技术术语,篇幅太长,无法进入此处。对于您所要求的,这个近似应该足够好:一个结构声明是完整的当且仅当它有这样的形式
struct foo {
/* list of fields */
};如果它出现在顶层,在试图访问struct字段的函数的文本上,则它是可见的。通常,声明来自头文件,但不需要这样做(请记住,#include对文本进行操作,而不是在符号表上操作,不像import那样)。
相反,如果您拥有的只是这样的声明
struct foo;然后,类型是不完整的,您对结构所能做的唯一的事情就是传递指向它的指针。
发布于 2011-05-02 20:04:27
是否可以在不知道其类型的情况下使用ty胡枝子结构?
好吧,是和不是。如果需要访问字段,则只需要包含声明结构的头文件,但如果只是向前传递指针,即在抽象层之间移动时传递一些参数,则不需要包含。
出现的另一个问题是,结构通常是如何在系统中发送的,使用它们的开发人员需要知道structs字段。
当编译器声明并看到结构时,编译器知道X类型的结构占用内存中的字节数以及数据的排序方式。如果在彼此之后声明了四个32位整数,它们将在内存中对齐128位或16字节。头文件像合同一样定义这一点。“如果包括我,这是我在内存中占用的字节数,这是属于我的不同类型”。
是刚刚声明它们的模块,开发人员需要找出字段吗?
我不太明白你在这里的意思。开发人员还可以查看头文件(就像编译器所做的那样)来查看相同的契约,但显然可以通过更高的抽象层(即人类可读的代码)来解释。因此,他/她可以知道结构中的第一个字段称为fooField。然后,开发人员知道他可以通过该名称或标识符访问该字段。
NumberStruct someNumberStruct;
getSomeNumbers(&someNumberStruct);
int number = someNumberStruct.fooField;可以在不知道数据字段的情况下访问结构化数据吗?
这是第一个问题的“是”。指针只是指向内存中的某个地址,只要您有读写该内存的权限,您就可以做任何事情。实际上,您可以将一些内容作为一个void* (即类型较少的指针)传递,并从同一契约中手动读取字节,您“知道”结构在内存和字段顺序上是如此之大,因为您已经查看了代码:)这显然有点危险,因为您必须确保该契约的另一端没有改变,然后就可能发生有趣的事情:)因此,当某些结构中的任何内容发生更改时,您必须更新使用该契约的所有代码,而不包括头文件。
希望这能为您的结构提供一些启示:)
https://stackoverflow.com/questions/5861582
复制相似问题