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

4 篇文章 1 订阅
3 篇文章 0 订阅

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中游鱼

获取完整源代码,提高工作效率

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值