2012-09-16 61 views
10

我使用下面的代码有很多在C:上typedef结构使用静态

typedef struct 
    { 
    int member; 
    } structname; 

现在我想要保持这种结构定义本地特定的源文件,所以没有其他的源文件,甚至知道结构存在。我试过以下内容:

static typedef struct 
    { 
    int member; 
    } structname; 

但是GCC由于非法访问说明符而发声。是否有可能保持一个结构的声明私人的源文件?

+5

这不是“呜呜”,老兄。这是*语法错误*。 – paulsm4

回答

21

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

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

你的陈述:因为你既不声明一个变量,也没有定义新类型

static typedef struct 

显然是非法的。

+0

对不起,我没有把我所有的代码放在第二次。编辑我的帖子来解决这个 – nuju

+5

它仍然是非法的我的朋友。静态只能用于声明一个变量或一个函数,而不能定义一个新的类型。静态和typefef不会在一起。 –

4

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

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

+0

这让我困惑。你是否说它必须被用作指针,即使它在头文件中? – Aerovistae

+0

@Aerovistae:如果它*在头文件中是*,那么它不是私有的,并且可以被包含头文件的任何文件完全使用。 – nneonneo

+0

我发布了一个关于这个问题,以免陷入长评论交流,如果你有兴趣回答 - http://stackoverflow.com/questions/27933144/how-do-structs-behave-in - 其他文件的能见度 – Aerovistae

3

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

如果您想限制使用您的struct,请将其声明在您使用它的文件中,或者创建一个只有您的文件包含的特殊标头。

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;