相关疑难解决方法(0)

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万
查看次数

为什么函数指针和数据指针在C/C++中不兼容?

我已经读过将函数指针转换为数据指针,反之亦然,但在大多数平台上都可以工作,但不能保证工作.为什么会这样?两者都不应该只是简单地址到主存储器中,因此兼容吗?

c c++ pointers function-pointers

128
推荐指数
10
解决办法
1万
查看次数

C中的静态断言

在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?

c gcc assert static-assert compile-time

79
推荐指数
4
解决办法
6万
查看次数

有没有办法在编译时计算整数类型的宽度?

char字节为单位的整数类型(或任何类型)的大小很容易计算为sizeof(type).一个常见的习惯用法是乘以CHAR_BIT找到该类型占用的位数,但是在使用填充位的实现中,这将不等于值位的宽度.更糟糕的是,代码如下:

x>>CHAR_BIT*sizeof(type)-1
Run Code Online (Sandbox Code Playgroud)

如果CHAR_BIT*sizeof(type)大于实际宽度,实际上可能有未定义的行为type.

为简单起见,我们假设我们的类型是无符号的.那么宽度typeceil(log2((type)-1).有没有办法将此值计算为常量表达式?

c integer padding width

14
推荐指数
2
解决办法
2893
查看次数

为什么OpenGL会为对象而不是指针提供句柄?

OpenGL的传统是让用户使用unsigned int句柄操作OpenGL对象.为什么不直接给指针?唯一ID比指针有什么优势?

opengl uniqueidentifier

3
推荐指数
1
解决办法
490
查看次数