代码之家  ›  专栏  ›  技术社区  ›  Tomas

在C++编译器中有一种标准化的方式来获得字节大小吗?

  •  1
  • Tomas  · 技术社区  · 14 年前

    sizeof() 不会切断它。

    如果他们的方法不是标准化的,那么大多数IDE使用的是传统方法吗?

    有没有其他任何人能想到的方法来获得这样的数据?

    思想?

    编辑:

    #ifdef / #endif
    

    我认为IDE或底层编译器可以在某个宏下定义这些信息,这是不是太天真了?当然,预处理器没有得到任何实际的机器代码生成函数的信息,但是IDE和编译器会这样做,它们会调用预处理器并提前向它声明内容。

    进一步编辑

    C++委员会有一个标准,它表示对于每种类型(可能只有C++的原生)编译器必须给IDE一个头文件,默认文件中包含了声明的内存,而这个原生类型使用的内存大小,如下:

    #define CHAR_SIZE 8
    #define INT_SIZE 32
    #define SHORT_INT_SIZE 16
    #define FLOAT_SIZE 32
    // etc
    

    这个过程中有什么缺陷吗?

    进一步编辑

    道歉:

    我一直在用“变量”而不是“类型”

    8 回复  |  直到 9 年前
        1
  •  3
  •   Kevin Lacquement    14 年前

    根据构建环境的不同,您可能可以编写一个实用程序,生成包含在其他文件中的头文件:

    int main(void) {
        out = make_header_file();  // defined by you
        fprintf(out, "#ifndef VARTYPES_H\n#define VARTYPES_H\n");
    
        size_t intsize = sizeof(int);
        if (intsize == 4)
            fprintf(out, "#define INTSIZE_32\n");
        else if (intsize == 8)
            fprintf(out, "#define INTSIZE_64\n");
        // .....
        else fprintf(out, "$define INTSIZE_UNKNOWN\n");
    }
    

    当然,可以根据需要进行编辑。然后在需要这些定义的地方包含“vartypes.h”。

    编辑

    fprintf(out, "#define INTSIZE_%d\n", (sizeof(int) / 8));
    fprintf(out, "#define INTSIZE %d\n", (sizeof(int) / 8));
    

    注意在第二个中缺少下划线-第一个创建 INTSIZE_32 可用于 #ifdef . 第二个创造 INTSIZE char bits[INTSIZE];

    警告 :这仅适用于8位 char . 大多数现代家庭和服务器计算机都将遵循这种模式;然而,有些计算机可能使用不同大小的 烧焦

        2
  •  3
  •   zwol    14 年前

    抱歉,此信息在预处理器阶段不可用。为了计算一个变量的大小,你必须做几乎所有的解析和抽象求值的工作-而不是 代码生成,但您必须能够计算常量表达式和替换模板参数,例如。您必须比预处理器通常了解更多关于代码生成目标的信息。

        3
  •  3
  •   greyfade    14 年前

    你为什么需要这个?

    The cstdint include typedef s和 #defines 类型定义 s表示确切宽度 int 类型和 它们的完整值范围。

        4
  •  2
  •   Jerry Coffin    14 年前

    不,不可能。举个例子,在一台机器上运行预处理器是完全可能的,在一台完全不同的机器上单独编译(可能)不同大小的(至少某些)类型。

    对于一个具体的例子,考虑 SQLite 是他们所说的“合并”--一个已经预处理的源代码文件,你实际上在你的计算机上编译。

        5
  •  2
  •   SingleNegationElimination    14 年前

    #include <iostream>
    
    template <int Tsize>
    struct dosomething{
      void doit() { std::cout << "generic version" << std::endl; }
    };
    
    template <>
    void dosomething<sizeof(int)>::doit()
    { std::cout << "int version" << std::endl; }
    
    template <>
    void dosomething<sizeof(char)>::doit()
    { std::cout << "char version" << std::endl; }
    
    
    int main(int argc, char** argv)
    {
      typedef int foo;
      dosomething<sizeof(foo)> myfoo;
      myfoo.doit();
    
    }
    
        6
  •  1
  •   Stack Overflow is garbage    14 年前

    那怎么办?在预处理阶段不知道大小。此时,您只有源代码。找到类型大小的唯一方法是编译它的定义。

    您不妨寻求一种方法来获得在编译阶段运行程序的结果。答案是“你不能,你必须运行程序才能得到它的输出”。就像你需要编译程序来获得编译器的输出一样。

    你想干什么?

    关于你的编辑,它似乎仍然困惑。

    可以想象,这样一个报头是内置的 类型

    再说一次,你想做什么?你想解决什么问题?如果你再给我们一点背景,也许有一个明智的解决办法。

        7
  •  1
  •   Scott Stafford    14 年前

    对于常见的构建环境,许多框架都是手动设置的。例如,

    http://www.aoc.nrao.edu/php/tjuerges/ALMA/ACE-5.5.2/html/ace/Basic__Types_8h-source.html

    定义像ACE\u SIZEOF\u CHAR这样的东西。在我买的一本书《波什》中描述的另一个图书馆也以一种非常包容的方式做到了这一点: http://www.hookatooka.com/wpc/

        8
  •  0
  •   JOTN    14 年前

    “标准化”一词就是问题所在。虽然没有标准的方法,但是使用某种配置实用程序设置一些预处理器符号并不是很困难。一个真正简单的方法是编译并运行一个小程序,用sizeof检查大小,然后输出一个包含一些符号集的include文件。