2012-07-05 46 views
3

我得到了一个“unnamed-struct”类型的全局对象,我试图定义它。我不想用这种无用的类型来污染我的全局命名空间(它只会被使用一次)。外部无名结构对象定义

Global.h

extern struct { 

    int x; 

} A; 

是否有这样的定义对象的任何正确的方式?
我是想这样的:

Global.cpp

struct { 

    int x; 

} A = { 0 }; 

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

+1

如果只使用一次,然后你为什么把它在.h文件? – 2012-07-05 17:23:52

+0

我在我的项目中使用它,它是全球性的。 – HemoGoblin 2012-07-05 17:25:34

+0

@HansPassant:他只有一个_instance_类。 – 2012-07-05 17:35:14

回答

2

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

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

1

有没有办法做到这这仅仅是因为它会很容易出错:一些在未来的时间有人(甚至可能是你)可能需要修改这个结构的定义,他可能忘记了这样做的头文件和源相应的文件。所以你必须为这个结构创建一个名称,并使用它的名称作为源文件,并将其定义保留在头部。

0

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

我只是碰到了这个问题,我所做的是我补充说,操纵结构到包含该匿名结构的文件的功能。这样我可以从我的项目中的任何文件调用该函数,并且它为我处理struct中的值。

下面是一个例子:

header.c有这个匿名结构:

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

我想操纵“interface.c”的值,因为我正在在另一个命令行界面文件。我的第一直觉是使用一个外部的,但它似乎像添加以下功能header.c一样好或更好(有些人反对使用实习医生时可以避免的)。

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); 

} 

现在,只要我包含该函数的原型,我就可以通过使用该函数来处理来自任何文件的那些结构变量。希望能帮助别人。