【问题标题】:x86-64 MSVC++/Intel C++ change size of int, long, etcx86-64 MSVC++/Intel C++ 更改 int、long 等的大小
【发布时间】:2016-03-27 08:27:48
【问题描述】:

我希望在编译时具有以下大小(使用 Visual C++ 2015 和/或 Intel C++ 16.0)

  • char 32 位无符号(用于 UTF-32 字符)
  • 短 32 位
  • int 64 位
  • 长 128 位
  • 指针和 size_t 64 位(目前是)

这有可能改变吗?我当前的解决方案使用宏:

#define int int64_t
#define char char32_t // Is this unsigned?
#define short int32_t
#define long __int128

但它有问题,比如“int main”不起作用......而且我无法定义“signed int”“unsigned int”等,因为宏名称不能有空格

编辑:我想这样做的原因是为了提高易读性(所以我不必编写 int64_t...),还可以使我使用的任何代码自动使用 int/char/short/long升级(重新编译时)使用 64/32/32/128 位,无需直接修改。

【问题讨论】:

  • 使signed int 行为符合您预期的唯一方法是修改编译器。哪一个,作为微软,你将无法做到。
  • 你正在尝试做的事情看起来像一个非常糟糕的想法。闻起来像an X Y problem。您能否编辑您的问题,解释为什么您要这样做?
  • 标准明确规定“翻译单元不得#define 或#undef 名称在词法上与关键字相同”int main 只是一个问题 - 考虑您包含的任何标准标头会发生什么。

标签: c++ visual-c++ icc


【解决方案1】:

你不能这样做。实现这一点的唯一正确方法是引入您自己的类型并改为使用它们。

此外,当使用像 int 这样的类型时,除了标准所说的之外,您不能依赖于底层大小(即在 int 的情况下,唯一的保证是它至少是 16 位)。您想要实现的是您不应该拥有的依赖项,这将使您的代码完全不可移植。此外,我不明白为什么int64_t 会比使用int 更易读。此外,您想要的重新定义会让其他开发人员意想不到,因此可能会导致错误。使用您自己的类型可以明确表明类型是不同的。

【讨论】:

    【解决方案2】:

    定义 unsigned int 时不必使用宏,可以编写如下代码:

    typedef unsigned int UINT;

    现在你也可以这样写代码了:

    #define UINT balabala

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多