繁体   English   中英

C语言中的通用编程-void *-const-correctness

[英]generic programming in C - void*- const-correctness

我的问题是,定义两个是否正确:

typedef void* Elem;
typedef const void* const constElem; 

如果我知道我将使用const和非const通用元素,例如将copyElem函数用作参数,那么我更希望将其作为const来获取,以确保const的正确性,这可行吗?

const void *const不会给您带来多少好处,除非它用作函数参数的类型:

void foo(const void *const e)
{
    e = NULL; // compile-time error because of the second const
    char *s = e; // compile-time error because of the first const
    const char *t = e; // OK
}
...
char x[] = "test";
foo(x); // you can be confident that foo will not modify the contents

对于常规用法,这是不切实际的,因为第一个const表示不能修改已取消引用的值,但是无论如何都不能取消引用空指针。 第二个const本质上不允许您在初始化指针后重新分配它。

我看不到这里是否存在正确性问题,只是因为是,您提供的两个typedef在语法上都是正确的,并且程序可能会同时使用这两种类型。

但是,就样式而言,将指针性质隐藏在typedef后面是不好的形式。 它很容易变得混乱。

将任何类型都定义为void *也有点可疑-它不提供任何意义的类型安全性,也没有提供太多的语义帮助。 如果您确实想接受指向任何内容的指针,则只需说出void * 另一方面,如果您想隐藏结构类型的详细信息,则只需将结构类型声明为不完整类型,然后以这种方式保留它:

struct Elem;

为方便起见,可以选择键入typedef:

typedef struct Elem Elem;

就个人而言,并再次作为一个风格问题,我希望看到的const的关键字,而不是看到,在推出一个typedef const ,无论多么明确指定。

还请注意,除了样式之外,还包括所有特定的typedef ...

typedef const void* const constElem;

...的作用似乎很窄。 它指定一个指针,其值不能更改,并且指向也不能更改的对象。 指向const对象的非const指针通常是您想要的。 还要注意,关于constElem应该意味着什么的不确定性是在Elem typedef中累积指针性质的结果之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM