【问题标题】:typedef visibilitytypedef 可见性
【发布时间】:2011-04-15 13:50:15
【问题描述】:

我有几个“.c .h”文件。 在头文件(.h)中,我定义了2个typedef struct,我们称它们为TS1和TS2。

现在,TS1 的一个成员的类型是 TS2。 我希望只有 TS1 可见。 TS2 应该被隐藏。 TS2 应该只对“.c”文件可见。

我怎样才能做到这一点?

【问题讨论】:

  • 该成员是声明为指针还是结构体?

标签: c struct typedef opacity


【解决方案1】:

我喜欢用“-internal”后缀命名私有头文件。对于你的例子,我有

foobar.c
    #include "foobar-internal.h"
    #include "foobar.h"
    /* functions using `struct TS1` and `struct TS2` */

.

foobar.h
    #ifndef H_FOOBAR_INCLUDED
    #define H_FOOBAR_INCLUDED
    struct TS1;
    #endif

.

foobar-internal.h
    #ifndef H_FOOBAR_INTERNAL_INCLUDED
    #define H_FOOBAR_INTERNAL_INCLUDED
    struct TS2 { int whatever; };
    struct TS1 { int whatever; struct TS2 internal; };
    #endif

任何使用您的函数的代码,包括更简单的"foobar.h",并且可以使用指向struct TS1 的指针。它不能直接使用struct TS1struct TS2 类型的对象。事实上,通过只包含"foobar.h",代码不知道任何地方都存在struct TS2 类型,并且可以根据自己的目的重新定义它。

usercode.c
    #include "foobar.h"
    struct TS1 *x;
    x = newTS1();
    work(x);
    destroyTS1(x);

【讨论】:

  • 请注意private不是C中的关键字。
  • @fnokke:谢谢。我将标识符更改为内部以避免混淆。
  • 但是当foobar-internal.h从来没有被包含在任何地方时,编译器怎么知道TS1TS2的定义呢?
  • @NiklasR:不能。您必须在某些源文件中#include "foobar-internal.h";通常是处理相关结构的源文件。
【解决方案2】:

我同意 Rumple。

你可以做的是例如.h 中的#define TS2 int#include 之后的.c 文件顶部的#undef TS2

虽然这不使用typedef。如果你想在多个.c文件中#include它,你也可以在.h文件底部#undef它。

【讨论】:

    【解决方案3】:

    AFAIK,这是不可能的。但是对于 TS1 和 TS2,您可以有 2 个不同的 .h 文件。

    【讨论】:

      猜你喜欢
      • 2012-11-04
      • 2012-09-24
      • 2013-06-14
      • 2012-06-15
      • 2012-05-10
      • 2017-11-28
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多