相关疑难解决方法(0)

如何创建类型安全枚举?

使用C中的枚举来实现类型安全是有问题的,因为它们基本上只是整数.实际上,枚举常量被定义为int标准的类型.

为了实现一点类型的安全性我用这样的指针做了一些技巧:

typedef enum
{
  BLUE,
  RED
} color_t;

void color_assign (color_t* var, color_t val) 
{ 
  *var = val; 
}
Run Code Online (Sandbox Code Playgroud)

因为指针具有比值更严格的类型规则,所以这会阻止这样的代码:

int x; 
color_assign(&x, BLUE); // compiler error
Run Code Online (Sandbox Code Playgroud)

但它不会阻止这样的代码:

color_t color;
color_assign(&color, 123); // garbage value
Run Code Online (Sandbox Code Playgroud)

这是因为枚举常量基本上只是一个int,可以隐式赋值给枚举变量.

有没有办法编写这样的函数或宏color_assign,即使对于枚举常量也可以实现完整的类型安全性?

c enums type-safety

54
推荐指数
4
解决办法
4058
查看次数

指针(地址)可以是负数吗?

我有一个函数,我希望能够返回失败未初始化的特殊值(它返回成功指针).

目前它为失败返回NULL,为未初始化返回-1,这似乎有效......但我可能会欺骗系统.iirc,地址总是积极的,不是吗?(虽然由于编译器允许我将地址设置为-1,这看起来很奇怪).

[更新] 我有另一个想法(如果-1是有风险的)是malloc一个char @全局范围,并使用该地址作为哨兵.

c signed pointers return-value

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

intptr_t有什么用?

我知道它是一个整数类型,可以在不丢失数据的情况下强制转换为指针,但为什么我要这样做呢?使用整数类型有什么优势void*可以保存指针和THE_REAL_TYPE*指针算术?

编辑
标记为"已被询问"的问题没有回答这个问题.问题是如果使用intptr_t作为一般的替换void*是一个好主意,那里的答案似乎是"不要使用intptr_t",所以我的问题仍然有效:什么是一个很好的用例intptr_t

c c++ pointers

25
推荐指数
5
解决办法
2万
查看次数

在64位指针中使用额外的16位

我读到64位机器实际上只使用48位地址(具体来说,我使用的是英特尔酷睿i7).

我希望额外的16位(位48-63)与地址无关,并将被忽略.但是当我尝试访问这样的地址时,我收到了一个信号EXC_BAD_ACCESS.

我的代码是:

int *p1 = &val;
int *p2 = (int *)((long)p1 | 1ll<<48);//set bit 48, which should be irrelevant
int v = *p2; //Here I receive a signal EXC_BAD_ACCESS.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?有没有办法使用这16位?

这可用于构建更多缓存友好的链表.不是将8个字节用于下一个ptr,而是将8个字节用于密钥(由于对齐限制),可以将密钥嵌入到指针中.

64-bit pointers x86-64 memory-access

6
推荐指数
3
解决办法
4559
查看次数

标签 统计

c ×3

pointers ×3

64-bit ×1

c++ ×1

enums ×1

memory-access ×1

return-value ×1

signed ×1

type-safety ×1

x86-64 ×1