标签: size-t

什么是C中的size_t?

size_t在C中感到困惑.我知道它是由sizeof运营商返回的.但究竟是什么呢?它是数据类型吗?

假设我有一个for循环:

for(i = 0; i < some_size; i++)
Run Code Online (Sandbox Code Playgroud)

我应该使用int i;size_t i;

c int size-t

590
推荐指数
10
解决办法
68万
查看次数

unsigned int vs. size_t

我注意到现代的C和C++代码似乎size_t代替int/ unsigned int几乎无处不在 - 从C字符串函数的参数到STL.我很好奇这个原因及其带来的好处.

c c++ size-t

478
推荐指数
5
解决办法
20万
查看次数

size_t vs. uintptr_t

C标准保证这size_t是一种可以保存任何数组索引的类型.这意味着,逻辑上,size_t应该能够保存任何指针类型.我在Googles上发现的一些网站上看到这是合法的和/或应该始终有效:

void *v = malloc(10);
size_t s = (size_t) v;
Run Code Online (Sandbox Code Playgroud)

那么在C99中,标准引入了intptr_tuintptr_t类型,它们是有符号和无符号类型,保证能够保存指针:

uintptr_t p = (size_t) v;
Run Code Online (Sandbox Code Playgroud)

那么使用size_t和有uintptr_t什么区别?两者都是无符号的,并且两者都应该能够保存任何指针类型,因此它们在功能上看起来相同.除了清晰度之外,是否有任何真正令人信服的理由uintptr_t(或者更好的是,a void *)而不是a size_t?在一个不透明的结构中,字段只能由内部函数处理,有没有理由不这样做?

出于同样的原因,ptrdiff_t一直是一个能够保持指针差异的签名类型,因此能够容纳大多数指针,那么它与它intptr_t有何区别?

是不是所有这些类型基本上都服务于同一功能的不同版本?如果没有,为什么?对于其中一个我不能用另一个做什么我不能做什么?如果是这样,为什么C99会在语言中添加两种基本上多余的类型?

我愿意忽略功能指针,因为它们不适用于当前的问题,但随意提及它们,因为我有一种潜在的怀疑,它们将成为"正确"答案的核心.

c pointers size-t

245
推荐指数
5
解决办法
6万
查看次数

我什么时候应该使用std :: size_t?

我只是想知道我应该使用std::size_tfor循环和东西而不是int?例如:

#include <cstdint>

int main()
{
    for (std::size_t i = 0; i < 10; ++i) {
        // std::size_t OK here? Or should I use, say, unsigned int instead?
    }
}
Run Code Online (Sandbox Code Playgroud)

一般来说,何时使用的最佳做法是什么std::size_t

c++ types idiomatic size-t loop-counter

187
推荐指数
9
解决办法
9万
查看次数

size_t和std :: size_t之间的区别

之间有什么区别size_tstd::size_t,当他们要使用,任何其他差异化功能在他们的声明,其中条款?

c++ size-t

123
推荐指数
3
解决办法
3万
查看次数

在C++中清除printf size_t的代码(或者:C++中C99的%z的最近等价物)

我有一些C++代码打印出size_t:

size_t a;
printf("%lu", a);
Run Code Online (Sandbox Code Playgroud)

我希望在32位和64位架构上编译时不会发出警告.

如果这是C99,我可以使用printf("%z", a);.但是AFAICT %z在任何标准C++方言中都不存在.所以相反,我必须这样做

printf("%lu", (unsigned long) a);
Run Code Online (Sandbox Code Playgroud)

这真的很难看.

如果没有size_t内置于该语言中的打印功能,我想知道是否可以编写一个printf包装器或类似的东西,这样可以在size_ts 上插入适当的强制转换,以便在保持好的编译器警告的同时消除虚假的编译器警告.

有任何想法吗?


编辑为了澄清为什么我使用printf:我有一个相对较大的代码库,我正在清理.它使用printf包装器来执行诸如"编写警告,将其记录到文件以及可能退出错误的代码"之类的操作.我可能能够用cout包装器来运行足够的C++ - foo,但是我不想改变程序中的每个warn()调用,只是为了摆脱一些编译器警告.

c++ printf size-t

94
推荐指数
7
解决办法
7万
查看次数

平台无关size_t c中的格式说明符?

我想size_t在C中打印出一个类型的变量,但似乎size_t在不同的体系结构上别名为不同的变量类型.例如,在一台计算机(64位)上,以下代码不会抛出任何警告:

size_t size = 1;
printf("the size is %ld", size);
Run Code Online (Sandbox Code Playgroud)

但在我的另一台机器(32位)上面的代码会产生以下警告消息:

警告:格式'%ld'需要类型'long int*',但参数3的类型为'size_t*'

我怀疑这是由于指针大小的不同,所以在我的64位机器size_t上别名为a long int("%ld"),而在我的32位机器size_t上别名为另一种类型.

是否有专门用于的格式说明符size_t

c size-t platform-independent format-specifiers format-string

76
推荐指数
2
解决办法
4万
查看次数

应该使用size_t或ssize_t

在我的代码中,我不使用int或unsigned int.我只使用size_t或ssize_t进行移植.例如:

typedef size_t intc;    // (instead of unsigned int)
typedef ssize_t uintc;  // (instead of int)
Run Code Online (Sandbox Code Playgroud)

因为strlen,string,vector...全部使用size_t,所以我通常使用size_t.我只会ssize_t在它可能是负面时使用.

但我发现:

无符号整数类型非常适合将存储视为位数组的用途.使用无符号而不是int来再获得一位来表示正整数几乎不是一个好主意.通过声明无符号变量来确保某些值为正的尝试通常会被隐式转换规则所取代.

"C++编程语言 "一书中.

所以我很困惑.我错了吗?为什么STL不遵守书中的建议?

c++ unsigned signed size-t

76
推荐指数
2
解决办法
9万
查看次数

什么是便携式方法来查找size_t的最大值?

我想知道我的程序运行的系统上size_t的最大值.我的第一直觉是使用负1,就像这样:

size_t max_size = (size_t)-1;
Run Code Online (Sandbox Code Playgroud)

但我猜测有更好的方法,或者某个地方定义的常数.

c size-t

71
推荐指数
4
解决办法
3万
查看次数

"std :: size_t"在C++中有意义吗?

在一些代码,我继承,我看到经常使用size_tstd命名空间限定词.例如:

std::size_t n = sizeof( long );
Run Code Online (Sandbox Code Playgroud)

当然,它编译并运行良好.但对我来说这似乎是不好的做法(也许是从C继承下来的?).

是不是真的size_t是内置到C++中,因此在全局命名空间中?是否需要size_t在C++中使用头文件?

提出这个问题的另一种方法是,是否需要在所有C++编译器上编译以下程序(没有包含)?

size_t foo()
{
    return sizeof( long );
}
Run Code Online (Sandbox Code Playgroud)

c++ size-t

58
推荐指数
3
解决办法
3万
查看次数