2012-07-05 57 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); 

} 

現在,只要我包含該函數的原型,我就可以通過使用該函數來處理來自任何文件的那些結構變量。希望能幫助別人。