【问题标题】:Using static on typedef struct在 typedef 结构上使用静态
【发布时间】:2012-09-08 19:18:44
【问题描述】:

我在 C 中经常使用以下代码:

typedef struct
  {
  int member;
  } structname;

现在我试图将该结构定义保留在特定源文件的本地,这样其他源文件甚至都不知道该结构存在。我尝试了以下方法:

static typedef struct
  {
  int member;
  } structname;

但是 GCC 因为非法的访问说明符而抱怨。甚至可以将结构的声明保持为源文件私有?

【问题讨论】:

  • 这不是“抱怨”,伙计。这是一个语法错误

标签: c static struct typedef


【解决方案1】:

如果您在 .c 文件中声明 typedef 结构,它将对该源文件是私有的。

如果您在 .h 文件中声明此 typedef,则包含此头文件的所有 .c 文件都可以访问它。

您的陈述:

static typedef struct

显然是非法的,因为您既没有声明变量也没有定义新类型。

【讨论】:

  • 对不起,我没有把我所有的代码都放在第二次。编辑了我的帖子以解决此问题
  • 它仍然是非法的我的朋友。 static 只能用于声明变量或函数,不能用于定义新类型。 static 和 typefef 不能同时使用。
【解决方案2】:

所有声明对于 C 中的特定翻译单元始终是本地的。这就是为什么您需要在打算使用给定声明的所有源文件中包含标头。

如果您想限制struct 的使用,请在您使用它的文件中声明它,或者创建一个只有您的文件包含的特殊标头。

【讨论】:

    【解决方案3】:

    结构定义对源文件是私有的,除非放在共享头文件中。没有其他源文件可以访问该结构的成员,即使给定了一个指向该结构的指针(因为布局在其他编译单元中是未知的)。

    如果结构需要在别处使用,它必须只用作指针。在头文件中放置struct structname; typedef struct structname structname; 形式的前向声明,并在代码库中的其他任何地方使用structname *。然后,由于结构成员只出现在一个源文件中,因此结构的内容实际上是该文件的“私有”。

    【讨论】:

    • 这让我很困惑。你是说即使在头文件中也必须作为指针使用?
    • @Aerovistae:如果它在头文件中,那么它不是私有的,可以被包含头文件的任何文件完全使用。
    • 我发布了一个关于此的问题,以免陷入冗长的评论交流中,如果您有兴趣回答--stackoverflow.com/questions/27933144/…
    【解决方案4】:

    Hernan Velasquez 的答案是正确答案:您的代码 sn-p 存在几个问题。这是一个反例:

    /* This should go in a .h if you will use this typedef in multiple .c files */
    typedef struct {
      int a;
      char b[8];
    } mystructdef;
    
    int
    main (int argc, char *argv[])
    {
      /* "static" is legal when you define the variable ...
        ... but *not* when you declare the typedef */
      static mystructdef ms;
    

    【讨论】:

      猜你喜欢
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多