在typedef结构上使用static

nuj*_*uju 16 c static struct typedef

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

typedef struct
  {
  int member;
  } structname;
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试将该结构定义保持为特定源文件的本地,因此没有其他源文件甚至知道结构存在.我尝试了以下方法:

static typedef struct
  {
  int member;
  } structname;
Run Code Online (Sandbox Code Playgroud)

但GCC因非法访问说明符而发牢骚.甚至可以将struct的声明保密为源文件吗?

Her*_*uez 33

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

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

你的陈述:

static typedef struct
Run Code Online (Sandbox Code Playgroud)

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

  • 它仍然是我的朋友非法.static只能用于声明变量或函数,而不能用于定义新类型.静态和typefef不会在一起. (6认同)

nne*_*neo 5

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

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


Car*_*rum 5

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

如果要限制使用,请struct在您使用它的文件中声明它,或者创建只包含文件的特殊标题.