我正在定义要通过不同设备和不同编程语言之间的通信通道接收和发送的结构.为此,我使用StructLayoutAttribute(顺序,pack = 1 - 在重要的情况下)在内存中明确定义它们的布局.
从文档中,我知道当struct只包含字段时它可以工作.它似乎也适用于'简单'属性(使用空get; set;).但是我不知道是不是总是如此.
所以我关于StructLayoutAttribute对属性的影响的问题分为两个:
Type.GetFields()不按特定顺序返回字段,但我想按声明顺序对它们进行排序.我怎样才能做到这一点?我没有看到FieldInfo中的'index'属性或具有类似功能的任何东西.
动机:我想实现一个类似于本答案中的位域解决方案,但正如第二条评论所述,订单无法保证.
编辑:澄清 - 我不想创建此代码依赖此顺序.我想创建此代码来解析已经具有特定排序的现有二进制数据.
编辑2(回答后):我选择了一个完全回答问题的答案,并且在我的测试中正常工作,但是作为旁注,位域解决方案存在问题:
从位字段读取值时,您会得到一个无符号整数(某个大小),但是根据您在FieldInfo运行时获得的实际字段类型(byte,bool,int),您无法正确转换它.您可以使用运行时显式条件(if type.Equals(typeof(bool))等)来完成它,但这有点难看.
我最终使用C++/CLI,这使得这更加简单.
我正在尝试在资源文件 (.rc) 中包含一个头文件。路径是这样的"folder_a/sub_folder_b/file_name.h"
folder_a 所在的文件夹包含在项目的 c++ 包含目录中。
当我在同一个项目的 .cpp 文件中编写相同的 #include 指令时,它会正确编译,但对于 .rc 文件,VS 找不到头文件。
在源代码编辑器窗口中,当我右键单击 #include 指令并选择“打开文档”时,弹出错误指出它找不到文件,显示搜索文件的路径,但项目的包含路径不是显示。
如果我对 .cpp 文件中的虚拟 #include 执行相同的操作(同样是同一个项目),所有路径都会显示在错误消息中。
我的结论是 VC++ 不使用项目中定义的包含目录,用于 .rc 文件中的 #include 指令。
这是真的?如果没有 - 我做错了什么?如果是 - 有没有办法解决它?
我试图避免:
#include "../../../parent_folder/folder_a/sub_folder_b/file_name.h"
但如果需要,我会去做。
#include <stdio.h>
#include <string.h>
int main(void){
char s1[30]="abcdefghijklmnopqrstuvwxyz";
printf("%s\n",s1);
printf("%s",memset(s1,'b',7));
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,但是当我像这样创建 s1 数组时,
char *s1="abcdefghijklmnopqrstuvwxyz";
Run Code Online (Sandbox Code Playgroud)
它不会在编译时出现任何错误,但无法在运行时运行。
我正在使用 Visual Studio 2012。
你知道为什么吗?
我发现 memset 的原型是:
void *memset( void *s, int c, size_t n );
Run Code Online (Sandbox Code Playgroud)