我在C中使用了以下代码:
typedef struct
{
int member;
} structname;
现在我正在尝试将结构定义保持为特定源文件的本地,因此没有其他源文件甚至知道结构存在。我尝试了以下方法:
static typedef struct
{
int member;
} structname;
但GCC因非法访问说明符而发牢骚。甚至可以将struct的声明保密为源文件吗?
答案 0 :(得分:30)
如果在.c文件中声明typedef结构,则该源文件将是私有的。
如果在.h文件中声明此typedef,则包含此头文件的所有.c文件都可以访问它。
您的陈述:
static typedef struct
显然是非法的,因为既没有声明变量也没有定义新类型。
答案 1 :(得分:5)
所有声明始终是C语言中特定翻译单元的本地声明。这就是为什么您需要在所有打算使用给定声明的源文件中包含标题。
如果您想限制struct
的使用,请在您使用它的文件中声明它,或者创建一个只包含您的文件的特殊标题。
答案 2 :(得分:4)
结构定义是源文件专用的,除非放在共享头文件中。没有其他源文件可以访问结构的成员,即使给定了指向结构的指针(因为在其他编译单元中不知道布局)。
如果需要在别处使用struct,则它必须仅用作指针。在头文件中放置struct structname; typedef struct structname structname;
形式的前向声明,并在代码库中的其他地方使用structname *
。然后,由于结构成员只出现在一个源文件中,因此结构的内容实际上是对该文件的“私有”。
答案 3 :(得分:1)
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;