16

现在我正在谈论程序员使用 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 类型编译程序?

4

5 回答 5

24

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

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

您会发现cppeven 的输出包括标记,以指示代码stdlib-expanded.c已包含在哪些文件中。

于 2012-09-19T08:08:59.620 回答
6

gcc 提供了一些头文件,这与此处相关:size_t定义在stddef.h哪个头文件中。例如,在/usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.h. 那里的定义size_t

typedef __SIZE_TYPE__ size_t;

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

于 2012-09-19T08:42:14.770 回答
3

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

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

#pragma stdlib_stddef_h

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

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

于 2012-09-19T08:33:24.467 回答
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
于 2012-09-19T08:33:39.047 回答
0

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

于 2016-09-27T06:19:31.303 回答