在 typedef 结构上使用 static

问题描述 投票:0回答:4

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

typedef struct
  {
  int member;
  } structname;

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

static typedef struct
  {
  int member;
  } structname;

但是 GCC 由于非法访问说明符而抱怨。是否有可能将结构体的声明保留为源文件的私有?

c static struct typedef
4个回答
42
投票

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

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

您的陈述:

static typedef struct

这是非法的,因为您没有声明变量或函数。


5
投票

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

如果您想限制

struct
的使用,请在使用它的文件中声明它,或者创建一个仅您的文件包含的特殊标头。


4
投票

结构定义对于源文件来说是私有的,除非放置在共享头文件中。即使给定了指向该结构的指针,其他源文件也无法访问该结构的成员(因为其他编译单元中不知道布局)。

如果该结构体需要在其他地方使用,则必须仅将其用作指针。在头文件中放置

struct structname; typedef struct structname structname;
形式的前向声明,并在代码库中的其他位置使用
structname *
。然后,由于结构成员仅出现在一个源文件中,因此该结构的内容对于该文件来说实际上是“私有”的。


1
投票

Hernan Velasquez 的答案是正确答案:您的代码片段存在 several 问题。这是一个反例:

/* 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;
© www.soinside.com 2019 - 2024. All rights reserved.