gpt4 book ai didi

c - 如何禁用对不透明变量的整数赋值(0)?

转载 作者:太空宇宙 更新时间:2023-11-04 06:07:34 25 4
gpt4 key购买 nike

我有一个模块,我想对其客户端隐藏其实现。

我选择声明一个不透明类型,它实际上是一个指向仅在实现中定义的结构的指针。

一切正常,除了我可以将零值分配给这种类型的变量,我想避免这种情况。

这是一个 C 语言的例子。

头文件foo.h

/* foo.h */
typedef struct foo *foo_t; /* <- sorry this was obviously flawed, the '*' was missing */


extern void foo_create( foo_t *t );
extern void foo_destroy( foo_t *t );
extern void foo_tile( foo_t x );

执行文件foo.c

/* foo.c */

#include <stdlib.h>

#include "foo.h"

struct foo {
int some_member;
};

void foo_create( foo_t *t )
{
if ( *t==0 ) {
*t = malloc( sizeof(struct foo) );
}
}

void foo_destroy( foo_t *t )
{
if ( *t!=0 ) {
free(*t);
*t = 0;
}
}


void foo_tile( foo_t t )
{
t->some_member++;
}

现在这里是一个使用该模块的示例客户端:bar.c:

#include "foo.h"

int main( int argc , char **argv )
{
foo_t toe;

foo_create( &toe );
toe = 0; /* <-- How to make the compiler (gcc) refuse this? */
toe = 1; /* <--- the compiler rejects this YAY!! */
}

不透明类型实际上是指向动态分配结构的指针;如果我将值 0 分配给它,我会导致内存泄漏,如果编译器拒绝将 0 分配给这个不透明的指针,则可以避免这种情况。

编译器不接受将非空值赋给指针,所以我想再多花点功夫也可以为零值实现同样的效果。

是否可以禁用此分配?我怎样才能做到这一点?如果需要使用一些 C++ 或 gcc 特定结构,我会同意的,尽管纯 C 解决方案会很好。

提前致谢。

最佳答案

首先,您的 typedef 是错误的:typedef struct foo foo_t;(所以它是您的 main,否则编译器将捕获对结构的赋值)。

对于不透明类型,通常会执行如下操作:typedef struct foo *foo_t;。否则你的 toe 不会是你发布的例子中的指针(这就是你必须用 & 传递它的原因)。考虑到 foo_create 中的 malloc,我敢肯定您输入了错误的 typedef。

其次,问问自己,如何释放内存?通过使用清理函数 (foo_destroy),对吧?并且用户应该将此指针传递给清理函数。

所以考虑一下:如果用户笨到可以给它分配一个整数,为什么她不会笨到忘记清理

编辑

Stéphane Gimenez 评论说typedef struct foo foo_t 是 OP 想要的。我想强调 that :

The only thing that the client can do with an object of such a type isto take its address, to produce an opaque pointer.

关于c - 如何禁用对不透明变量的整数赋值(0)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7015988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com