相关疑难解决方法(0)

哪个C++标准头定义了SIZE_MAX?

我正在研究一个恰好SIZE_MAX在几个地方使用的现有C++代码库.我做了一些重构,现在SIZE_MAX没有在其中一个模块中定义.当Travis-CI尝试在Linux上构建项目时出现此问题.它在重构之前工作正常,但是跟踪包含哪些精确的头文件很困难.

为了在本地复制问题,我安装了一个带有默认gcc的Ubuntu VM,并且能够重现它.以下是相关来源:

#include <stddef.h>

int main()
{
    size_t a = SIZE_MAX;
}
Run Code Online (Sandbox Code Playgroud)

命令行很简单:

g++ a.cpp
Run Code Online (Sandbox Code Playgroud)

错误是:

a.cpp: In function ‘int main()’:
a.cpp:5:16: error: ‘SIZE_MAX’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

系统信息:

$ uname -a
Linux quartz 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Run Code Online (Sandbox Code Playgroud)

我曾尝试包括cstdint,stdint.h,limits.h,inttypes.h,stdio.h,stdlib.h,,可能有一些人,我想不出我需要哪些特定的头文件SIZE_MAX.

重要的是要注意我正在编写的程序编译正常SIZE_MAX …

c++ header size-t stdint

16
推荐指数
2
解决办法
1万
查看次数

`long`保证与`size_t`一样宽

当寻找unsigned long足以为size_t争论目的而持有的证据时,printf我遇到了两个事实(oid).

首先,这个答案说明long确实不能保证足够大size_t.另一方面,我看到这个答案暗示printf("%lu", (unsigned long)x)在C99之前使用,x是的size_t.

所以问题是你可以假设或者你保证在C99之前long就足够了.另一个问题是,是否存在适合任何其他标准化整数类型的保证(除了明显的例外情况,例如,等等).size_tsize_tssize_tptrdiff_t

c c89 language-lawyer

4
推荐指数
1
解决办法
703
查看次数

如何在C89中获得SIZE_MAX

我想进入SIZE_MAXC89.

我想到了以下方法SIZE_MAX:

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

由于标准(§6.2.1.2ANSIC)说:

当有符号整数转换为具有相等或更大大小的无符号整数时,如果有符号整数的值为非负,则其值不变.否则:如果无符号整数的大小更大,则有符号整数首先被提升为与无符号整数对应的有符号整数; 通过向该值添加一个大于可以在无符号整数类型 28中表示的最大数字的值,将该值转换为无符号

脚注28:

在二进制补码表示中,如果无符号整数具有更大的大小,则除了用符号位的副本填充高位以外,位模式中没有实际的变化.

这似乎已经定义了行为,但我不太确定我是否正确理解了该段落的措辞.

请注意,这个问题明确是关于C89的,所以不能回答我的问题,因为标准有不同的措辞.

如果这不起作用,我提出的另一种方式是:

size_t get_size_max() {
    static size_t max = 0;
    if (max == 0) {
        max -= 1U;
    }

    return max;
}
Run Code Online (Sandbox Code Playgroud)

但我在标准中找不到任何关于无符号整数下溢的信息,所以我在这里瞎了.

c size-t c89

4
推荐指数
1
解决办法
1784
查看次数

标签 统计

c ×2

c89 ×2

size-t ×2

c++ ×1

header ×1

language-lawyer ×1

stdint ×1