繁体   English   中英

在typedef结构上使用static

[英]Using static on typedef struct

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

typedef struct
  {
  int member;
  } structname;

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

static typedef struct
  {
  int member;
  } structname;

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

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

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

你的陈述:

static typedef struct

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

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

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

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

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

Hernan Velasquez的答案是正确答案:您的代码段有几个问题。 这是一个反例:

/* 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM