Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何跨多个翻译单元共享不透明类型?_C_Linux_Struct - Fatal编程技术网

C 如何跨多个翻译单元共享不透明类型?

C 如何跨多个翻译单元共享不透明类型?,c,linux,struct,C,Linux,Struct,我正在做我自己的C项目,需要一些设计/常用的C语言建议。我试图解决的问题是打开已配置设备的输入日期流。但我希望将配置和设备分开。以下是我尝试过的: 配置: config.h #ifndef CONFIG_H #define CONFIG_H typedef struct config_t config_t; config_t* config_t_allocate(void); void config_t_free(config_t *); //functions to set configu

我正在做我自己的C项目,需要一些设计/常用的C语言建议。我试图解决的问题是打开已配置设备的输入日期流。但我希望将配置和设备分开。以下是我尝试过的:

  • 配置:
  • config.h

    #ifndef CONFIG_H
    #define CONFIG_H
    
    typedef struct config_t config_t;
    
    config_t* config_t_allocate(void);
    void config_t_free(config_t *);
    //functions to set configuration parameters
    
    #endif //CONFIG_H
    
    config.c

    #include <stdlib.h>
    #include "device.h"
    
    struct config_t{
        const char * name;
    };
    
    config_t* config_t_allocate(void){
        return malloc(sizeof(config_t));
    }
    
    void config_t_free(config_t * config_ptr){
        free(config_ptr);
    }
    
    device.c

    #include "device.h"
    #include <sys/fcntl.h>
    
    struct device_t{
        int fd;
    };
    
    //Does not compile. What is the confit_t type?
    void configure_device(device_t** device, config_t* config_ptr){
        *device = malloc(sizeof(**device));
        (*device) -> fd = open(config_ptr -> name, O_RDONLY);
    }
    

    我需要
    config\u t

    的任何地方都包含它如果您使用像
    config\u t
    这样的不透明类型,那么您就放弃了在源代码中直接访问其成员的选项,而这些成员与实现细节无关。不过,您可以提供一个函数来实现这一点:

    extern const char *config_t_get_name(config_t *config);
    
    或者在
    config.h
    中声明,在
    config.c
    中定义,在
    device.c
    中使用

    但是把
    struct config{const char*name;}编码到某个头文件中,我不会公开它(有点像库私有文件),并在实现C文件中到处使用它。这不是很普遍吗?还是有一些缺点


    实际上,访问函数的主要替代方法是“私有”头,但这通常不如访问函数好。这是可以做到的;这并非完全不常见,尤其是如果需要访问结构内部的函数套件太大,无法正常地放入单个源文件中(或者因为本地规则是“每个源文件一个非静态函数”,或者…)。因此,困难在于确保不应该与私有头相关的文件不能(不)使用它。这表明私有标头不应与库一起安装,并且可能私有标头应位于项目的公共标头之外的单独目录中

    考虑是否应强制执行:

     #include "project/headerX.h"             // General, public headers for the project
     #include "project/private/internal.h"    // Private headers for limited use
    
    然后,您可以通过使用
    grep
    或同等工具来发现不允许的引用等方式来监控私有标头的使用。或者,或者结合使用私有标头的独特命名方案,使用
    pvt\uu
    前缀表示“私有”:

    #include "project/internal/pvt_config.h"
    
    这个主题有无穷的变化。程序员将设计各种各样的方案来访问私有报头以利用它们。最终,你必须相信你的程序员会遵守规则——你不应该使用私有头,除非在明确授予使用它们权限的文件中。如果他们不能接受这种纪律,也许他们根本就不应该参与这个项目。或者你应该花点时间去理解为什么顽固的程序员不能使用你提供的访问函数——设计有什么问题吗


    您可以在谷歌(或您选择的搜索引擎)上搜索“
    getters setters
    ”;结果似乎是有益的。添加您选择的语言(C++、Java、JavaScript占据显著位置;C不那么突出,但它确实会调出可能有用的引用)。

    如果您使用像
    config\u t
    这样的不透明类型,您就放弃了在源代码中直接访问其成员的选项,而这些成员并不了解实现细节。不过,您可以提供一个函数来实现这一点:

    extern const char *config_t_get_name(config_t *config);
    
    或者在
    config.h
    中声明,在
    config.c
    中定义,在
    device.c
    中使用

    但是把
    struct config{const char*name;}编码到某个头文件中,我不会公开它(有点像库私有文件),并在实现C文件中到处使用它。这不是很普遍吗?还是有一些缺点


    实际上,访问函数的主要替代方法是“私有”头,但这通常不如访问函数好。这是可以做到的;这并非完全不常见,尤其是如果需要访问结构内部的函数套件太大,无法正常地放入单个源文件中(或者因为本地规则是“每个源文件一个非静态函数”,或者…)。因此,困难在于确保不应该与私有头相关的文件不能(不)使用它。这表明私有标头不应与库一起安装,并且可能私有标头应位于项目的公共标头之外的单独目录中

    考虑是否应强制执行:

     #include "project/headerX.h"             // General, public headers for the project
     #include "project/private/internal.h"    // Private headers for limited use
    
    然后,您可以通过使用
    grep
    或同等工具来发现不允许的引用等方式来监控私有标头的使用。或者,或者结合使用私有标头的独特命名方案,使用
    pvt\uu
    前缀表示“私有”:

    #include "project/internal/pvt_config.h"
    
    这个主题有无穷的变化。程序员将设计各种各样的方案来访问私有报头以利用它们。最终,你必须相信你的程序员会遵守规则——你不应该使用私有头,除非在明确授予使用它们权限的文件中。如果他们不能接受这种纪律,也许他们根本就不应该参与这个项目。或者你应该花点时间去理解为什么顽固的程序员不能使用你提供的访问函数——设计有什么问题吗


    您可以在谷歌(或您选择的搜索引擎)上搜索“
    getters setters
    ”;结果似乎是有益的。添加您选择的语言(C++、Java、JavaScript占显著位置;C不占显著位置,但它确实会调出可能有用的引用)。

    在需要
    config\t
    类型的任何地方都包括
    config.h
    头文件。@Someprogrammerdude,但它不包含实际的结构定义。不太理解。如果使用不透明类型,如
    config\t
    ,则放弃直接在源代码中访问其成员的选项,而这些成员与实现细节无关。您可以提供一个函数来实现这一点:
    extern char*config\u t\u get\u na