在Linux中,C++的size_t定义在哪里?

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的类型...

但无论如何,我都无法找到链的结尾。

是否有人知道在哪里可以找到最终定义以检查它是否为unsigned int(或类似类型)?也许我错过了开发包?如果是这种情况,那么为什么我能够编译使用size_t类型的程序呢?


尝试使用递归grep命令:"grep -r" - Brady
可能是重复的问题:std::size_t vs size_t vs std::____::size_type - trojanfoe
@Brady:sudo apt-get install ack-grep - Stefan Majewsky
3
@john应该尝试使用更好的问题标题。这个标题太泛泛了。 - Gorpik
5个回答

26

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

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

你会发现cpp的输出结果中甚至包括了标记,用于指示哪些文件中的代码已经被包含在stdlib-expanded.c中。


4
仅输入“echo '#include <stdlib.h>' | cpp -I/usr/include | grep size_t”即可得到第一行为“typedef long unsigned int size_t;”。 - stijn
回显 '#include <stdlib.h>' | cpp -I/usr/include | grep size_t 做到了。谢谢! - user2548100
@Stefan Majewsky,您好,您如何使用gcc而不是cpp执行相同的命令? - Nulik
@Nulik:你为什么要这样做?据我所知,gcc本身就在使用cpp。 - Stefan Majewsky
@StefanMajewsky 不用管了,我找到了,它是-E标志,例如:echo“#include <stdlib.h>”| gcc -E -”,我不使用C ++,我只写C。 - Nulik

7

gcc提供了一些相关的头文件:其中size_tstddef.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位类型 -- 因此,使标头独立于编译器参数)。


他们为什么不使用具有相同行为的“unsigned long”呢?看起来,如果未定义宏,则默认为“unsigned long”,因此我不太理解此宏的用途。看起来 - Ayxan Haqverdili
@AyxanHaqverdili 无符号长整型至少为32位。在某些平台上,例如16位的size_t,它们现在大多具有历史或利基的兴趣。 - AProgrammer

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

3

其他人写道,如果你搜索所有包含的文件,你可能会找到它。然而,这是大多数实现方式的事实并不保证。

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

#pragma stdlib_stddef_h

如果上述预处理指令有效地提供了标准规定的头文件内容,则完全符合要求。

换句话说,size_t是无符号整数类型,因为标准规定如此,而不是因为您可以在头文件中读取到这样的信息。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接