cheroky Asked: 2020-04-27 12:07:26 +0800 CST 2020-04-27 12:07:26 +0800 CST 2020-04-27 12:07:26 +0800 CST 不完整的类型和不透明的指针 772 据我所知,我已经看过有关此问题的英文文章,据我所知,它们用于C中的封装。有人可以解释一下不完整类型和不透明指针到底是什么吗?它们在 C 中有什么用途? c 1 Answers Voted Best Answer NaCl 2020-04-27T13:24:13+08:002020-04-27T13:24:13+08:00 不完整类型顾名思义,是一种没有定义的类型,用不透明的指针来补充,考虑下面的例子: fecha.h typedef struct date date_t; unsigned get_hours(date_t *dt); //... Resto de funcionalidades fecha.c typedef struct date { // implementación de la estructura. } date_t; 你有一个不透明的实现,只提供数据结构声明date_t,只允许你的库的用户指向结构的指针和一组函数来赋予它行为。 一切都在代码文件中定义,将被编译以将二进制文件交付给使用它的任何人。 这些实现用于使最终用户尽可能隐藏代码,因此他们不知道内部指针的内容。 到底: 不透明指针:它是一个指向未知结构(4 或 8 字节)的指针,我们不知道它们包含什么或它们的实际大小。 不完整类型:在最终用户眼前只声明但未定义的类型。 一个实际的例子: /* date_t.h */ #ifndef DATE_T_HEADER #define DATE_T_HEADER /* declaración opaca */ typedef struct date date_t; /* algunos métodos */ date_t *new_date(void); unsigned get_hours(date_t *dt); void set_hours(date_t *dt, unsigned t); unsigned get_difference_seconds(date_t *dt1, date_t *dt2); void delete_date(date_t *dt); #endif /* DATE_T_HEADER */ /* date_t.c */ #include <stdlib.h> #include <stdio.h> #include "date_t.h" /* Definición de la estructura */ typedef struct date { size_t time; char holamundo; } date_t; /* FAIL PADDING, sizeof esta estructura es 16 u 8 ... */ date_t *new_date(void) { date_t *ptr = malloc(sizeof(struct date)); return ptr; } unsigned get_hours(date_t *dt) { if (dt) return dt->time; return 0; } void set_hours(date_t *dt, unsigned t) { if (dt) dt->time = t; } unsigned get_difference_seconds(date_t *dt1, date_t *dt2) { if (dt1 && dt2) return dt1->time - dt2->time; return 0; } void delete_date(date_t *dt) { if (dt) { free(dt); dt = NULL; } } /* test.c */ #include <stdio.h> #include "date_t.h" int main(void) { date_t *ptrdate = new_date(); printf("Nueva fecha\nAjustando a 55 las horas...\n"); set_hours(ptrdate, 55); if (get_hours(ptrdate) == 55) printf("En efecto es 55.\n"); date_t *se = new_date(); printf("Creada nueva fecha...\n"); set_hours(se, 10); printf("Diferencias: %u\n", get_difference_seconds(ptrdate, se)); delete_date(ptrdate); delete_date(se); } 请注意,它是颠倒的,所以它可能根本无法工作(等待我找到我的电脑)。 尝试以下命令行以获得结果: > gcc -o date.o -c -std=c11 date.c > gcc -o test.o -c -std=c11 test.c > gcc -o test *.o 它应该返回以下结果: Nueva fecha Ajustando a 55 las horas... En efecto es 55. Creada nueva fecha... Diferencias: 45 SN 1:-std=c11因为你永远不必失去风格。 最后,在 C 中实现这种类型的不透明度的主要优点是您限制了用户能够对您的结构进行的更改的数量,这有一个副作用,因为不是每个人都想按照您的方式做事。,但是在使软件销售时,实现很有用。 和 C 中的所有东西一样,滥用这种方法是不好的。 1:旁注。
不完整类型顾名思义,是一种没有定义的类型,用不透明的指针来补充,考虑下面的例子:
fecha.h
fecha.c
你有一个不透明的实现,只提供数据结构声明
date_t
,只允许你的库的用户指向结构的指针和一组函数来赋予它行为。一切都在代码文件中定义,将被编译以将二进制文件交付给使用它的任何人。
这些实现用于使最终用户尽可能隐藏代码,因此他们不知道内部指针的内容。
到底:
一个实际的例子:
请注意,它是颠倒的,所以它可能根本无法工作(等待我找到我的电脑)。
尝试以下命令行以获得结果:
它应该返回以下结果:
SN 1:
-std=c11
因为你永远不必失去风格。最后,在 C 中实现这种类型的不透明度的主要优点是您限制了用户能够对您的结构进行的更改的数量,这有一个副作用,因为不是每个人都想按照您的方式做事。,但是在使软件销售时,实现很有用。
和 C 中的所有东西一样,滥用这种方法是不好的。
1:旁注。