linux中定义的c ++ size_t在哪里?

时间:2012-09-19 07:58:07

标签: c++

现在我正在讨论程序员使用typedef关键字的新类型定义。只要我的学生习惯使用size_t类型(例如使用funciton length()),我必须要求他们稍微努力才能“相信”它是一个整数类型,我认为它会很棒显示noew它们定义了这种类型。

所以,我在ubuntu框中的/ usr / include中做了很多grep,而我看到的是size_t反过来又是对size_type的重新定义,而w又是对metadata_type的重新定义,这就是在此目录中结束。找不到最终的“typedef unsigned int metadata_type;”。

在/ usr / src中我找到了anohter以前的类型叫yy_size_t,...

但是,无论如何我都无法到达链的末端。

有谁知道在哪里找出最终的定义来检查它是无符号的int(或类似的)? 可能我想念我的盒子里的开发包吗?在这种情况下,为什么我能够使用size_t类型编译程序?

5 个答案:

答案 0 :(得分:22)

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

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

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

答案 1 :(得分:6)

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位类型 - 使报头独立于编译器参数。)

答案 2 :(得分:3)

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

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

#pragma stdlib_stddef_h
如果上面的pragma有效地提供了标准为该标题规定的内容,那么

将完全符合。

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

答案 3 :(得分:3)

为了完整起见,您是否考虑过简单地向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

答案 4 :(得分:0)

std::size_t<cstddef>中定义。请参阅http://en.cppreference.com/w/cpp/header/cstddef