【问题标题】:Where is c++ size_t defined in linuxc++ size_t在linux中定义在哪里
【发布时间】:2012-09-19 07:58:07
【问题描述】:

现在我正在谈论程序员使用 typedef 关键字定义的新类型。只要我的学生习惯了 size_t 类型(例如通过使用函数 length ()),我不得不让他们稍微努力“相信”它是一个整数类型,我认为它会很棒向他们展示这种类型的定义位置。

所以,我在 Ubuntu 机器中的 /usr/include 中做了很多 grep,我看到 size_t 是 size_type 的重新定义,而 size_type 又是 metadata_type 的重新定义,这就是在这个目录下结束。没有找到最终的“typedef unsigned int metadata_type;”。

在 /usr/src 中,我发现了另一个名为 yy_size_t 的先前类型,...

但是,无论如何我都无法到达链条的尽头。

有谁知道在哪里可以找到最终定义以检查它是否是无符号整数(或类似的)? 我可能会错过我盒子里的开发包吗?在这种情况下,为什么我可以使用 size_t 类型编译程序?

【问题讨论】:

  • 尝试递归 grep:“grep -r”
  • @Brady: sudo apt-get install ack-grep
  • @john 确实如此,您应该尝试为您的问题使用更好的标题。这个太笼统了。

标签: c++


【解决方案1】:

您可以尝试使用 C 预处理器 (cpp) 手动扩展标准包含文件并检查其输出:

$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c

您会发现cpp 的输出甚至包含标记,以指示包含stdlib-expanded.c 中的代码的文件。

【讨论】:

  • +1 只是echo '#include &lt;stdlib.h&gt;' | cpp -I/usr/include | grep size_ttypedef long unsigned int size_t; 作为第一行
  • echo '#include ' | cpp -I/usr/包括| grep size_t 成功了。谢谢!
  • @Stefan Majewsky ,你如何使用 gcc 而不是 cpp 来做到这一点(我的意思是,执行相同的命令)?
  • @Nulik:你为什么要这么做?据我所知,gcc 正在使用 cpp 本身。
  • @StefanMajewsky 没关系,我找到了,它是 -E 标志,例如:echo "#include " | gcc -E -" 我不使用 C++,我只使用 C 编写。
【解决方案2】:

gcc 提供了一些标头,这与此处相关:size_tstddef.h 中定义,这是其中一个标头。例如,这里是/usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.hsize_t 的定义是

typedef __SIZE_TYPE__ size_t;

__SIZE_TYPE__ 是一个编译器预定义的宏(它允许确保编译器和头文件一致,并且编译器期望的取决于它的参数——例如,使用 -m32 它是一个无符号的 32 位位,并且使用 -m64 一个无符号的 64 位类型 --,使标头独立于编译器参数)。

【讨论】:

    【解决方案3】:

    正如其他人所写,如果您搜索所有包含文件,您可能会找到它。但是,不能保证这是大多数实现的工作方式。

    标准规定,例如,#include &lt;stddef.h&gt; 应为size_t 提供定义,该定义必须是无符号整数类型。但它也表示不需要在文件系统的任何位置都存在名为 stddef.h 的文件。甚至提供了这样一个文件但该文件只包含以下行的实现

    #pragma stdlib_stddef_h
    

    如果上述编译指示有效地提供了标准对该标头的规定,则将完全符合要求。

    换句话说,size_t 是无符号整数类型,因为这是标准所说的,而不是因为您可以在头文件中读取。

    【讨论】:

      【解决方案4】:

      为了完整起见,您是否考虑过简单地向 C++ 询问size_t

      #include <iostream>
      #include <cstddef>
      #include <limits>
      
      int main()
      {
          std::cout << "sizeof(size_t) = " << sizeof(std::size_t) << std::endl;
          std::cout << "is size_t an integer? " <<
              (std::numeric_limits<std::size_t>::is_integer ? "yes" : "no")
              << std::endl;
          std::cout << "is size_t signed? " <<
              (std::numeric_limits<std::size_t>::is_signed ? "yes" : "no")
              << std::endl;
      }
      

      给我

      sizeof(size_t) = 8
      is size_t an integer? yes
      is size_t signed? no
      

      【讨论】:

        【解决方案5】:

        std::size_t&lt;cstddef&gt; 中定义。见http://en.cppreference.com/w/cpp/header/cstddef

        【讨论】:

          猜你喜欢
          • 2019-01-01
          • 2019-08-06
          • 2012-03-15
          • 2011-04-05
          • 1970-01-01
          • 2012-12-12
          • 1970-01-01
          • 2012-11-12
          • 2023-04-10
          相关资源
          最近更新 更多