我和这个答案的印象一样, size_t总是由标准保证足够大,以保持给定系统的最大可能types。 但是,这段代码无法在gcc / Mingw上编译: #include <stdint.h> #include <stddef.h> typedef uint8_t array_t [SIZE_MAX]; 错误:数组'array_t'的大小太大 我在这里误解标准的东西吗? 对于给定的实现, size_t是否允许过大? 或者这是Mingw的另一个bug? 编辑:进一步的研究表明 typedef uint8_t array_t [SIZE_MAX/2]; // does compile typedef uint8_t array_t [SIZE_MAX/2+1]; // does not compile 这碰巧是一样的 #include <limits.h> typedef uint8_t array_t [LLONG_MAX]; // does compile typedef uint8_t array_t [LLONG_MAX+(size_t)1]; // does not compile 所以我现在倾向于认为这是Mingw中的一个bug,因为基于有符号整数types设置允许的最大大小没有任何意义。
在我inheritance的一些代码中,我经常使用size_t和std命名空间限定符。 例如: std::size_t n = sizeof( long ); 它编译并运行良好,当然。 但对我来说这似乎是不好的做法(也许是从C结束?)。 是不是真的size_t内置到C ++,因此在全局命名空间? 包含在C ++中使用size_t所需的头文件? 另一个问这个问题的方法是,下面的程序( 不包括)是否可以在所有C ++编译器上编译? size_t foo() { return sizeof( long ); }
我想用C打印出一个size_ttypes的variables,但是看起来size_t在别的体系结构上被别名为不同的variablestypes。 例如,在一台机器上(64位),以下代码不会引发任何警告: size_t size = 1; printf("the size is %ld", size); 但在我的其他机器(32位)上面的代码产生以下警告消息: 警告:格式'%ld'需要input'long int *',但参数3的types是'size_t *' 我怀疑这是由于指针大小的差异,所以在我的64位机器size_t被别名为long int ( "%ld" ),而在我的32位机器size_t别名为另一种types。 是否有一个格式说明符专门为size_t ?
我有一些打印size_t C ++代码: size_t a; printf("%lu", a); 我希望在32位和64位架构上编译时不会有任何警告。 如果这是C99,我可以使用printf("%z", a); 。 但是AFAICT %z不存在任何标准的C ++方言。 相反,我必须这样做 printf("%lu", (unsigned long) a); 这真的很丑。 如果没有内置的语言打印size_t的设施,我想知道是否可以编写一个printf包装器,或者是这样的,以便在size_t上插入适当的强制转换,从而消除虚假的编译器警告,同时保持良好的状态。 有任何想法吗? 编辑为了澄清为什么我使用printf:我有一个相对较大的代码库,我正在清理。 它使用printf包装来执行诸如“写入警告,将其logging到文件中,并可能退出错误代码”等。 我可能能够鼓起足够多的C ++ -foo来使用cout包装器来做到这一点,但是我宁愿不改变程序中的每一个warn()调用来摆脱一些编译器警告。
size_t和std::size_t在声明的位置和应该使用的地方以及其他区别特征之间有什么区别?
我注意到现代的C和C ++代码似乎几乎在任何地方都使用size_t来代替int / unsigned int – 从C字符串函数的参数到STL。 我很好奇这个原因和它带来的好处。
我在C中与size_t混淆。我知道它是由sizeof运算符返回的。 但究竟是什么呢? 这是一种数据类型吗? 假设我有一个for循环: for(i = 0; i < some_size; i++) 我应该用int i; 或size_t i; ?