0

目前我有一个程序需要为众多功能打包属性。代码必须可在 Windows Visual Studio C++ 和 GCC C++ 之间互换。目前它很难阅读,我想用 C++ 宏来清理它,但是,我注意到在我使用一次宏之后,下一行代码退出当前命名空间。有没有办法来解决这个问题?这是类似于我正在处理的示例代码和问题的图像。

#if defined(_WIN32) || defined(_WIN64)
#define PACK( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop))
#else
#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
#endif

namespace test {
  PACK(typedef struct temp1 {
    int a;
    int b;
  });

  PACK(typedef struct temp2 {
    int c;
    int d;
  });
}

在此处输入图像描述在此处输入图像描述

在 Visual Studio 中,当我的光标位于第一个结构中时,VS 显示它在名称空间测试中,但是,在全局名称空间中的第二个。关于什么可以解决这个问题的任何想法?

到目前为止,我的结构看起来更像下面的代码,它可以工作,但它使阅读变得更加困难,尤其是使用 100 多个这样的打包结构。

#define PACK __attribute__((__packed__))

namespace test {
  #if defined(_WIN32) || defined(_WIN64)
  #pragma pack(push, 1)
  #endif
  typedef struct temp1 {
    int a;
    int b;
  }
  #if defined(_WIN32) || defined(_WIN64)
  temp2;
  #pragma pack(pop)
  #else
  PACK temp2;
  #endif

  #if defined(_WIN32) || defined(_WIN64)
  #pragma pack(push, 1)
  #endif
  typedef struct temp2 {
    int c;
    int d;
  }
  #if defined(_WIN32) || defined(_WIN64)
  temp2;
  #pragma pack(pop)
  #else
  PACK temp2;
  #endif
}
4

1 回答 1

0

在 C++ 中不需要typedef声明。struct仅在 C 中才需要,如果您不想在struct每个使用结构类型的地方(变量、函数参数等)都使用关键字。

在 Visual Studio 中,在第一个声明#pragma pack(push, 1)之前放一个单曲,在最后一个声明后放一个单曲会更容易。您不需要单独打包结构。struct#pragma pack(pop)struct

在 GCC 上,您可以跳过#pragma并仅__attribute__((packed))在每个struct声明中使用。

尝试更多类似的东西:

#ifdef __GNUC__
#define PACKED_ATTR __attribute__ ((__packed__))
#else
#define PACKED_ATTR
#endif

namespace test {
  #ifdef _MSC_VER
  #pragma pack(push, 1) // or: #include <pshpack1.h>
  #endif

  struct PACKED_ATTR temp1 {
    int a;
    int b;
  };

  struct PACKED_ATTR temp2 {
    int c;
    int d;
  };

  // and so on ...

  #ifdef _MSC_VER
  #pragma pack(pop) // or: #include <poppack.h>
  #endif
}
于 2020-07-23T23:02:34.163 回答