在 Borland C++ 上使用 #pragma pack 和 #define

2024-05-22

我正在尝试使用 Borland C++Builder (XE6) 打包一些结构(将来:bcc)。

我正在使用一个库,它使用以下构造来创建结构:

#ifdef _MSC_VER
    #define PACKED_BEGIN __pragma(pack(push, 1))
    #define PACKED 
    #define PACKED_END __pragma(pack(pop))
#elif defined(__GNUC__)
    #define PACKED_BEGIN
    #define PACKED  __attribute__((__packed__))
    #define PACKED_END
#endif


PACKED_BEGIN
struct PACKED {
    short someSampleShort;
    char sampleByte;
    int sampleInteger;
} structType_t;
PACKED_END

bcc 编译器不喜欢 MSC__pragma,并且不喜欢宏内部的预处理器指令,尽管它在他们的网站 http://docwiki.embarcadero.com/RADStudio/XE7/en/Define:

#define GETSTD #include <stdio.h>

我的问题是:是否有可能将此构造与 Borland 编译器一起使用来打包结构without using:

#pragma pack(1) 

打包每个结构?

有没有解决方法?


正如您所说,C++Builder 不支持宏内部的预处理器语句。 Embarcadero 网站上对此进行了记录:

#定义 (C++) http://docwiki.embarcadero.com/RADStudio/XE8/en/Define

在每个单独的宏扩展之后,将对新扩展的文本进行进一步扫描。这允许嵌套宏的可能性:扩展文本可以包含需要替换的宏标识符。但是,如果宏扩展为看起来像预处理指令的内容,则预处理器将无法识别该指令。

这样做的原因是因为#宏内部的字符保留给预处理器字符串化运算符.

一些编译器,包括 MSVC,通过以下方式绕过了这个限制__pragma()编译器扩展,或 C99/C++x0_Pragma()扩大。 C++Builder 的视窗32位编译器不支持其中任何一个。然而,其视窗 64 位 and mobile编译器(全部基于 clang 并支持 C++11)DO支持他们俩。因此,您可以在宏中添加对这些编译器的支持,如下所示:

#if defined(__BORLANDC__)
    #if defined(__clang__)
        #define PACKED_BEGIN __pragma(pack(push, 1))
        #define PACKED 
        #define PACKED_END __pragma(pack(pop))
    #else
        #error Cannot define PACKED macros for this compiler
    #endif
#elif defined(_MSC_VER)
    #define PACKED_BEGIN __pragma(pack(push, 1))
    #define PACKED 
    #define PACKED_END __pragma(pack(pop))
#elif defined(__GNUC__)
    #define PACKED_BEGIN
    #define PACKED  __attribute__((__packed__))
    #define PACKED_END
#else
    #error PACKED macros are not defined for this compiler
#endif

如果你想支持C++Builder视窗32位编译器,您必须将逻辑移动到使用的 .h 文件中#pragma为它,然后你可以#include这些文件在需要的地方(至少在编译器更新为支持 clang/C++11 之前——Embarcadero 目前正在开发):

pack1_begin.h:

#if defined(__BORLANDC__)
    #define PACKED_BEGIN
    #define PACKED 
    #define PACKED_END
    #pragma pack(push, 1)
#elif defined(_MSC_VER)
    #define PACKED_BEGIN __pragma(pack(push, 1))
    #define PACKED 
    #define PACKED_END __pragma(pack(pop))
#elif defined(__GNUC__)
    #define PACKED_BEGIN
    #define PACKED  __attribute__((__packed__))
    #define PACKED_END
#else
    #error PACKED macros are not defined for this compiler
#endif

pack_end.h:

#if defined(__BORLANDC__)
    #pragma pack(pop)
#endif

然后你可以这样做:

#include "pack1_begin.h"
PACKED_BEGIN
struct PACKED {
    short someSampleShort;
    char sampleByte;
    int sampleInteger;
} structType_t;
PACKED_END
#include "pack_end.h"

如果您采用这种方法,您可以直接删除PACKED_BEGIN/PACKED_END共:

pack1_begin.h:

#if defined(__BORLANDC__) || defined(_MSC_VER)
    #define PACKED
    #pragma pack(push, 1)
#elif defined(__GNUC__)
    #define PACKED  __attribute__((__packed__))
#else
    #error PACKED macro is not defined for this compiler
#endif

pack_end.h:

#if defined(__BORLANDC__) || defined(_MSC_VER)
    #pragma pack(pop)
#endif
#include "pack1_begin.h"
struct PACKED {
    short someSampleShort;
    char sampleByte;
    int sampleInteger;
} structType_t;
#include "pack_end.h"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Borland C++ 上使用 #pragma pack 和 #define 的相关文章

随机推荐

  • 在 Android strings.xml 文件中使用 HREF

    我正在尝试从 strings xml 文件中为 TextView android text 属性分配以下字符串 我无法让链接显示为可点击的超链接 有什么建议么 我尝试过以下技术
  • Java导入语句中的错误“无法解析导入javax.validation.constraints.NotNull”

    开发Spring roo项目后 我在类中发现以下错误 The import javax validation constraints NotNull cannot be resolved NotNull cannot be resolved
  • Google 表格 - ARRAYFORMULA 中的 VLOOKUP

    我正在尝试在 Google 表格中的数组公式内进行 Vlookup 我有两张纸 S1 和 S2 每个列都有 3 个相同的列 A 列 日期 B 列 名称 和 C 列 付款类型 我想根据日期和姓名组合匹配将付款类型从表 2 读取到表 1 这意味
  • 是否有使用 Hamcrest 'describeMismatch' 功能的 JUnit assertThat 版本?

    在我尝试过的每个 JUnit 版本中 直到 4 8 1 失败的assertThat 都会显示一条错误消息 如下所示 预期 描述 得到 对象的字符串表示 换句话说 它将显示对象的 toString 而不是匹配器中的不匹配描述 如果我使用 or
  • 查找所有 DHCP 和 DNS 服务器

    我有一位客户要求我找到他所有的 Dhcp 和 DNS 服务器以及一些附加信息 例如 DC 服务器和操作系统 所以我决定尝试提高我的 powershell 技能 但我对此还很陌生 所以我写了这个脚本 但我想仍然缺少一些东西 因为它不起作用 编
  • 如何找到您在服务器中的加入位置

    寻找一种方法来查找您何时按位置加入服务器 例如 如果我是服务器的所有者 我将是 1 因为我先加入 然后如果我在所有者之后加入 我将是 2 如果我在 20 人加入后加入 我将是 21 依此类推 有谁知道如何在 Node Js 中解决这个问题
  • STI 在遗传类型之间发生变化。

    在我的模型中 我像这样使用 STI 车辆型号 vehicle rb class Vehicle lt ActiveRecord Base end 车型 car rb class Car lt Vehicle end 总线模型 bus rb
  • 文件夹“Images.xcassets”不存在

    当我在最新的 xcode 版本中打开项目文件时 我在两个弹出窗口中收到错误 文件夹 Images xcassets 不存在 我必须多次单击 确定 才能使弹出窗口消失 我没有采取任何措施来删除此类文件夹 有谁知道我为什么会得到它们 Updat
  • 如何在购物车中显示自定义属性(Magento)

    我尝试了很多东西 但没有一个起作用 我想我可以在产品页面上获取自定义属性 但我想知道 如何在购物车页面中获取它们 属性只是简单的文字 item gt getProduct gt load 将从数据库重新加载所有产品数据 虽然这可行 但请记住
  • 将 JavaScript 数组转换为具有属性的数组

    我有一个像这样的数组从服务器返回响应 111 1010 111 1010 1010 我想将其转换为 JavaScript JSON 如下所示 branch 111 branch 1010 branch 111 branch 1010 bra
  • TinyMCE 的 addButton() 函数中所有可能的设置属性是什么?

    The 文档 http www tinymce com wiki php API3 method tinymce Editor addButton对此还不是很清楚 name 字符串 要添加的按钮名称 设置 对象 带有标题 cmd 的设置对象
  • Google App Engine 中的图像上传

    我正在开发一个网站 用户可以上传与某个位置相关的帖子 然后他们可以添加两到三张照片 我了解如何使用数据存储区或 Blobstore 进行基本上传 但我想将这些照片链接到帖子和用户 然后能够在连接到帖子和用户的所有页面中显示它们 这是一般的想
  • 增加 D3 图中边缘的可点击区域

    我有一个由 d3 制作的图 dagre d3 位于其顶部用于绘制有向图 这给出了我对渲染图表的期望 要编辑构建图表的数据 每个元素都是可单击的 这对于使用标签渲染边缘的情况来说很好 但它们并不总是有标签 导致未标记的边缘很难单击进行编辑 分
  • AdMob 广告未显示

    因此 我使用 Play Services SDK 实施了 AdMob 广告 我已经 按照书本 做了所有事情 但广告不会显示 如果我将 AdView 背景设置为白色 它会显示空白 但不显示广告 我正在使用 Fragments 但我将 AdVi
  • jQuery:确定
  • 是否包含
  • 我有一些包含嵌套的 HTML 代码 ul 元素 我需要为每个元素添加一个 父级 类 li 包含子元素的元素 ul 一个元素中可能直接包含多个元素 li e g li li a a span span ul ul li 我所需要的只是确定一个
  • 将片段部分移出屏幕

    我已经被这个问题难住有一段时间了 我试图将包含在 FrameLayout 中的片段向右移动 以便只有片段的左侧 20 可见 我认为我遇到的问题是父级不会让片段移出其边界 或者我不知道如何移动它 我所尝试的一切只是将片段推到右墙上 然后缩放片
  • 如何让 Spring 控制器从 POJO 返回 CSV? [复制]

    这个问题在这里已经有答案了 给定一个简单的 Java 对象 public class Pojo private String x private String y private String z getters setters 是否有一些
  • 执行卸载之前停止 Windows 服务

    我有一个安装程序 它安装了一些组件 包括 Windows 服务 安装后它将启动使用 CustomAction 安装到系统上的服务 当我卸载应用程序时出现问题 安装程序要求先关闭应用程序 然后再继续 我创建了一个将停止服务的自定义操作 并通过
  • ServiceStack操作命名约定可以被覆盖吗?

    我需要为 ServiceStack 服务定义一个 DTO 类 服务堆栈使用基于类名的约定 因此如果我的类称为 Transmission 则相应的服务将使用 HTTP 操作中使用的类型为 Transmission 的公开元数据 但我已经有了
  • 在 Borland C++ 上使用 #pragma pack 和 #define

    我正在尝试使用 Borland C Builder XE6 打包一些结构 将来 bcc 我正在使用一个库 它使用以下构造来创建结构 ifdef MSC VER define PACKED BEGIN pragma pack push 1 d