• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

VB、C#、VC使用条件编译自动选择结构体对齐方式

武飞扬头像
中游鱼
帮助1

VB、C#、VC使用条件编译使程序自动选择结构体对齐方式


一、系统默认内存对齐

1、Windows 64 位系统默认 8 字节,Windows 32 位系统默认 4 字节

2、Linux 64 位系统默认 8 字节,Linux 32 位系统默认 4 字节


二、常用程序默认对齐

1、Office 64 位程序默认 8 字节,Office 32 系统默认 4 字节(VBA 结构体编程才能体会)

2、Visual Studio 2017 默认 8 字节(VB、C#、VC 都是默认 8 字节),VC2017 可以选择结构体对齐(1、2、4、8、16)

3、Visual Studio 6.0 默认 4 字节,VC6.0 可以选择结构体对齐(1、2、4、8、16)


三、使用条件编译自动选择结构体对齐方式

根据内存发展的规则,32 位系统默认 4 字节对齐,64 位系统默认 8 字节对齐,那么采用VS编程就可以使用条件编译程序。

以 VB.net 2017 为例,在项目属性里,高级编译选项,设置定义 TRACE 常数:

1、选择项目 x64 平台,自定义常量 x64 = True

学新通

或者,选择项目 x86 平台,自定义常量 x86 = True

学新通

2、编辑条件编译程序代码

VB.NET 代码:
#If x86 Then   '编译是 x86 平台,按 4 字节结构体参数  '条件编译语句,根据选择的编译平台,选择结构体的对齐方式
    ''' <summary>椭球转换参数</summary> 
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)>'编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure SevenParam
        Dim dX As Double 'X平移
        Dim dY As Double 'Y平移
        Dim dZ As Double 'Z平移
        Dim rX As Double 'X旋转
        Dim rY As Double 'Y旋转
        Dim rZ As Double 'Z旋转
        Dim K As Double '尺度
    End Structure
    ''' <summary>定义椭球投影参数</summary>   
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)>   '编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure ProjectionParam
        ''' <summary>中央子午线</summary>
        Dim CentralMeridian As Double
        ''' <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
        Dim CentBool As Boolean
        ''' <summary>投影尺度</summary>
        Dim ProjectionScale As Double
        ''' <summary>是否自动椭球参数的布尔值</summary>
        Dim eTwoBool As Boolean
        ''' <summary>北向常数</summary>
        Dim NorthwardConstant As Double
        ''' <summary>是否北向或南向坐标的布尔值</summary>
        Dim NortBool As Boolean
        ''' <summary>东向常数</summary>
        Dim EasterlyConstant As Double
        ''' <summary>是否东向或西向坐标的布尔值</summary>
        Dim EastBool As Boolean
    End Structure
#Else    '编译不是 x86 平台,按 8 字节结构体参数
    ''' <summary>椭球转换七参数</summary> 
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)>'编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure SevenParam
        Dim dX As Double 'X平移
        Dim dY As Double 'Y平移
        Dim dZ As Double 'Z平移
        Dim rX As Double 'X旋转
        Dim rY As Double 'Y旋转
        Dim rZ As Double 'Z旋转
        Dim K As Double '尺度
    End Structure
    ''' <summary>定义椭球投影参数</summary>   
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)>   '编译为X86,采用Pack=4。编译为X64,Pack=8或默认。
    Public Structure ProjectionParam
        ''' <summary>中央子午线</summary>
        Dim CentralMeridian As Double
        ''' <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
        Dim CentBool As Boolean
        ''' <summary>投影尺度</summary>
        Dim ProjectionScale As Double
        ''' <summary>是否自动椭球参数的布尔值</summary>
        Dim eTwoBool As Boolean
        ''' <summary>北向常数</summary>
        Dim NorthwardConstant As Double
        ''' <summary>是否北向或南向坐标的布尔值</summary>
        Dim NortBool As Boolean
        ''' <summary>东向常数</summary>
        Dim EasterlyConstant As Double
        ''' <summary>是否东向或西向坐标的布尔值</summary>
        Dim EastBool As Boolean
    End Structure
#End If
学新通
C# 代码与 VB.NET 类同
先设置高级编译选项的自定义常数,然后编辑如下代码:
#if x86 //编译是 x86 平台,按 4 字节结构体参数 '条件编译语句,根据选择的编译平台,选择结构体的对齐方式
	/// <summary>椭球转换参数</summary> 
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=4)]
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=4)]
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
#else //编译不是 x86 平台,按 8 字节结构体参数
	/// <summary>椭球转换七参数</summary> 
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=8)]
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=8)]
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
#endif

学新通
VC 可以直接进入项目属性,C/C 的代码生成里,设置结构成员对齐,x64 设置为 8 字节,x86 设置为 4 字节,如图

学新通
学新通

也可以具体编辑需要设置对齐的代码:
#ifdef _M_IX86 //编译是 x86 平台,按 4 字节结构体参数 '条件编译语句,根据选择的编译平台,选择结构体的对齐方式(或 _WIN32)
	/// <summary>椭球转换参数</summary> 
    #pragma pack(4)/按4字节对齐
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
	#pragma pack()//恢复默认对齐
	
#else // _M_X64 //编译不是 x86 平台,按 8 字节结构体参数 (或 _WIN64)
	/// <summary>椭球转换七参数</summary> 
    #pragma pack(8)//按8字节对齐
	public struct SevenParam
	{
		public double dX; //X平移
		public double dY; //Y平移
		public double dZ; //Z平移
		public double rX; //X旋转
		public double rY; //Y旋转
		public double rZ; //Z旋转
		public double K; //尺度
	}
	/// <summary>定义椭球投影参数</summary>   
	public struct ProjectionParam
	{
		/// <summary>中央子午线</summary>
		public double CentralMeridian;
		/// <summary>是否采用自动计算中央子午线或输入中央子午线的布尔值</summary>
		public bool CentBool;
		/// <summary>投影尺度</summary>
		public double ProjectionScale;
		/// <summary>是否自动椭球参数的布尔值</summary>
		public bool eTwoBool;
		/// <summary>北向常数</summary>
		public double NorthwardConstant;
		/// <summary>是否北向或南向坐标的布尔值</summary>
		public bool NortBool;
		/// <summary>东向常数</summary>
		public double EasterlyConstant;
		/// <summary>是否东向或西向坐标的布尔值</summary>
		public bool EastBool;
	}
	#pragma pack()//恢复默认对齐
#endif

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiebccj
系列文章
更多 icon
同类精品
更多 icon
继续加载