【问题标题】:Opaque datatypes and structures in cc中的不透明数据类型和结构
【发布时间】:2021-12-31 21:57:41
【问题描述】:

我有一个非常简单的问题。 如果我有这样的源代码文件:

#include<stdio.h>
#include"example.h"


struct mystructure{
    //Data Variables
    int a;
};

int main(){
   mystructure somename;
   somename.a = 1;
   
   printf("%d\n", somename.a);
    return 0;
}

使用这样的头文件:

#ifndef EXAMPLE_HEADER_H
#define EXAMPLE_HEADER_H

// Opaque declaration.
struct mystructure;
typedef struct mystructure mystructure;

#endif

代码可以正常编译。我也可以在头文件中定义结构,它会编译得很好。

但是,如果我在不同的源代码文件中定义结构并尝试使用主源代码文件编译它,它将不断抛出有关前向声明的错误。

有没有办法在源代码文件中定义结构,在头文件中给它一个 typedef 并在其他源文件的其他地方使用它?

我一直在通过在头文件中定义结构来做这件事,但我想知道如何以更不透明的方式做到这一点。

【问题讨论】:

  • 结构体需要在表头中。唯一的选择是通过提供一堆函数来操作不透明的指针。一个分配一个对象并给出一个指针,另一个销毁它,以及访问每个需要公开的成员,等等。
  • 如果多个文件需要访问不透明类型的内部,那么您可以有一个声明不透明类型的公共头和一个定义结构的私有头。特权代码包括私有标头;非特权代码使用公共标头中声明的设施,它必须提供一般用户对不透明类型的实际数据所需的任何访问权限。私有标头应该包含公共标头以确保事情保持同步——然后特权代码只包含私有标头。
  • 这很有趣。我将不得不阅读更多相关信息:关于私人标题here 的帖子

标签: c struct definition opaque-types


【解决方案1】:

执行此声明和声明

mystructure somename;
somename.a = 1;

编译器需要知道结构struct mystructure的完整定义。例如,它需要知道为对象somename 分配多少内存以及结构是否具有数据成员a。

因此,结构的定义必须在包含这些声明和语句的 main 模块中可见。

要隐藏结构定义,您可以声明struct mystructure * 类型的指针并调用函数来初始化此指针和指向对象的数据成员。对应的函数必须知道结构体定义。

【讨论】:

  • 我想我会继续在头文件中定义结构(我正在编写需要在其他源文件的其他位置设置数据成员的应用程序)。但至少我现在知道了。但是,您使用具有特殊功能的指针访问成员的解决方案非常有启发性。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多