Extern未命名的struct对象定义

时间:2012-07-05 17:21:03

标签: c++ struct global-variables extern

我有一个类型为“unnamed-struct”的全局对象,我正在尝试定义它。我不想用这种无用的类型污染我的全局命名空间(它只会被使用一次)。

Global.h

extern struct {

    int x;

} A;

有没有正确的方法来定义这样的对象?
我正在尝试这个:

Global.cpp

struct {

    int x;

} A = { 0 };

但VS2012抛出“错误C2371:'A':重新定义;不同的基本类型”。感谢。

3 个答案:

答案 0 :(得分:2)

一种可能的解决方案:创建另一个文件Global_A.cpp,不包含 Global.h,并在那里定义A。通过等效定义规则,只要匿名结构定义是等效的,这将是有效的。

这仍然是一个坏主意,大多数编译器会警告它,例如(gcc):警告:非局部变量`< anonymous struct> A'使用匿名类型

答案 1 :(得分:1)

没有办法做到这一点只是因为它容易出错:未来某个时候某人(甚至可能是你)可能想要修改这个结构的定义,他可能会忘记在头文件和源文件中这样做因此。因此,您必须为此结构创建一个名称,并将其名称用作源文件,并将其定义保留在标题中。

答案 2 :(得分:0)

我不知道这对你有帮助吗,这是我的第一篇文章......所以请放轻松。

我刚刚遇到了这个问题而我所做的是我添加了一个函数来操作结构到包含匿名结构的文件。这样我就可以从我项目中的任何文件中调用该函数,并为我操作结构中的值。

以下是一个例子:

header.c有这个匿名结构:

 struct 
   {    
       char  line1[80];
       char  line2[80];
       char  line3[80];
   } header;

我想在" interface.c"中操纵这些值。因为我在另一个文件中创建命令行界面。我的第一直觉是使用extern,但似乎在header.c中添加以下函数同样好或更好(有些人在可避免时不鼓励使用externs)。

void changeHeaders(char *one, char *two, char *three);
void changeHeaders(char *one, char *two, char *three)
{

    strcpy(header.line1, one);
    printf("\nHeader 1: %s", header.line1);
    strcpy(header.line2, two);
    printf("\nHeader 2: %s", header.line2);
    strcpy(header.line3, three);
    printf("\nHeader 3: %s", header.line3);

}

现在,只要我包含该函数的原型,我就可以使用该函数从任何文件中操作这些结构变量。希望有所帮助。