我在C中经常使用以下代码:
typedef struct
{
int member;
} structname;
现在,我正在尝试将该结构定义保留在特定源文件的本地,以便其他源文件甚至不知道该结构的存在。 我尝试了以下方法:
static typedef struct
{
int member;
} structname;
但海湾合作委员会因为非法访问说明符而发牢骚。 是否可以将结构的声明保留为源文件的私有?
如果在 .c 文件中声明 typedef 结构,则该结构对于该源文件将是私有的。
如果在 .h 文件中声明此 typedef,则包含此头文件的所有 .c 文件都可以访问它。
您的陈述:
static typedef struct
显然是非法的,因为您既没有声明变量也没有定义新类型。
所有声明始终是 C 中特定翻译单元的本地声明。 这就是为什么您需要在打算使用给定声明的所有源文件中包含标头的原因。
如果要限制struct
的使用,请在使用它的文件中声明它,或者创建一个仅包含您的文件的特殊标头。
定义是源文件的私有定义,除非放置在共享头文件中。没有其他源文件可以访问结构的成员,即使给定了指向该结构的指针(因为布局在其他编译单元中是未知的)。
如果需要在其他地方使用该结构,则必须仅将其用作指针。在头文件中放置表单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;