我在 C 中经常使用以下代码:
typedef struct
{
int member;
} structname;
现在我试图将该结构定义保留在特定源文件的本地,这样其他源文件甚至都不知道该结构存在。我尝试了以下方法:
static typedef struct
{
int member;
} structname;
但是 GCC 因为非法的访问说明符而抱怨。甚至可以将结构的声明保留为源文件私有吗?
如果您在 .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;