【问题标题】:C/C++ forward declaration in typedeftypedef 中的 C/C++ 前向声明
【发布时间】:2013-09-06 01:32:12
【问题描述】:

查看我看到的OpenCL头文件:

typedef struct _cl_context * cl_context;

我知道cl_context 是一个指向前向声明结构_cl_context 的指针。

从图书馆设计师的角度来看,这样做有什么好处:

typedef struct _cl_context cl_context;

是否只是这样 API 调用可以使用 cl_context 而不是 cl_context*?但如果是这样,为什么不这样做:

typedef void *cl_context;

【问题讨论】:

    标签: c++ c opencl typedef forward-declaration


    【解决方案1】:

    这是一种构建 API 的类型安全方式,无需暴露类型的内部结构(即实现细节)。

    typedef struct _cl_context* cl_context;
    

    这样做允许您使用 cl_context 类型定义 API,无需在头文件中的任何位置定义 struct _cl_context。很明显,这些函数将这种类型(指针)作为参数,但用户不必为 struct _cl_context 的细节感到负担。该结构可以在别处定义(在 .c 文件或私有头文件中)。

    你提到的另一种方法是:

    typedef void* cl_context;
    

    这在很多地方也被使用。但是需要在所有地方的代码中进行类型转换,然后才能解释参数。而且它不是类型安全的。用户可以传入任何指针作为参数,编译器会接受它——这不是一件好事。就来回传递的参数而言,使用真实类型可确保一些安全。

    【讨论】:

    • 谢谢,我没有考虑过用户可能会尝试传递垃圾并将其作为无效接受的情况*。
    【解决方案2】:

    在 C 中,当你声明一个结构时:

    struct foo { };

    要声明这个结构的一个实例,你会说:

    struct foo f;

    因此,C 程序员倾向于声明如下结构:

    typedef struct foo { } foo;

    如,foostruct foo 的类型定义

    C++ 没有这个要求。

    我不认为 typedef struct cl_context; 编译。也许你的意思是typedef struct _cl_context cl_context;

    是否只是为了 API 调用可以使用 cl_context 而不是 cl_context*?

    typedef 会同时处理这两个问题,并且无需在类型声明前添加 struct

    你肯定不想使用typedef void *cl_context;,因为那样你就会失去类型安全性。

    【讨论】:

    • 谢谢,你说得对,我的意思是“typedef struct _cl_context cl_context;”而不是“typedef struct cl_context;”。我已经在我的问题中纠正了这一点。这也是一个很好的答案,我没有考虑消除“struct”关键字!希望我能同时接受。
    猜你喜欢
    • 2010-10-22
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    相关资源
    最近更新 更多