现在我正在讨论程序员使用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类型编译程序?
答案 0 :(得分:22)
您可以尝试手动使用C预处理器(cpp
)扩展标准包含文件,并检查输出:
$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c
您会发现cpp
的输出甚至包含标记,用于指示stdlib-expanded.c
中的代码包含在哪些文件中。
答案 1 :(得分: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位类型 - 使报头独立于编译器参数。)
答案 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。