2010-03-15 134 views
1

這是我的錯誤:C語言編譯錯誤

error: static declaration of doct follows non-static declaration
error: previous declaration of doct was here.

而且我的代碼是:

int doct(int*); /* <- Second error points here */ 

private int doct(int *a) 
    { 
    static int a=0; /* First error points here */ 
    a++; 
    *a=a; 
    return 0; 
    } 

有什麼建議?

void foo(void); 

static void foo(void) {} 

使在兩個static匹配,或者通過從兩個移除或將其添加到以下兩者:

+4

也許發佈一些源代碼會有幫助嗎? – Extrakun 2010-03-15 08:52:01

+0

來源在哪裏?我不能多說這件事。 – 2010-03-15 08:52:35

+2

建議:發佈一些代碼,以便我們知道錯誤所指的是什麼。這與我們問「結果是12,等式是什麼」沒有什麼不同。 – GManNickG 2010-03-15 08:54:42

回答

2

此錯誤當一個函數被聲明爲非靜態,則定義的靜態,如發生。確保你瞭解static做什麼。

如果你的功能被標記爲static,它只在該翻譯單元中可見。在你的情況下,你的聲明沒有靜態的意思,「這個函數將可用,非靜態的」,但是然後你靜態地定義它。


還有其他錯誤。您的功能中的a將在參數列表中隱藏a。你需要給他們不同的名字。 *a = a將不起作用,因爲在該範圍內,a是一個整數,而不是指針。對整數使用描述性名稱,如counter

+0

但在我的功能沒有靜態關鍵字。 – ambika 2010-03-15 09:06:28

+2

@ambika:你有'私人'。 'private'不是* C語言的一部分,所以我不能給你任何其他的東西。爲了生成這個錯誤,'private'必須是'static'的宏。那就是:'#define private static'。因此,在聲明中也加上「'private'」,或從定義中刪除「'private'」。我建議你使用'static'而不是'private',因爲它很混亂(請看這個問題的答案。:)) – GManNickG 2010-03-15 09:08:19

+0

謝謝GMan 你超級。 我解決了這個問題。 – ambika 2010-03-15 10:24:18

3

您的原型應符合您的實際功能。你別:

int doct(int*); 
private int doct (int *a) 

要麼改變原型:

private int doct(int*); 

或改變功能:

int doct (int *a) 

你也應該記住,private不是的一部分C語言,但人們經常用它來代替靜態。這可以通過線成爲可能:

#define private static 

,唯一的條件是您隨時隨地使用private名宏必須是活動的。如果它不在你的原型上工作,那可能是因爲它沒有在那個時候定義。我的建議是完全拋棄private並使用靜態(如果確實這樣定義了private)。人們應該學習語言,不要採取不必要的柺杖(在我看來)。

其他的收藏,我也鄙視有:

#define global extern 
#define begin { 
#define end } 

privateglobal分別用來指本地文件和全局的所有文件。該beginend從人特別討厭憎惡誰應該回到帕斯卡爾他們:-)

屬於除了這個問題,你行:

static int a = 0; 

實際上將隱藏的參數您正在進入該功能(因爲它具有相同的名稱)並且:

*a = a; 

將導致錯誤(因爲它具有不同的類型)。這樣做不是一個好主意。重命名其中一個。

+0

我製作 int doct(int *); 至 private int doct(int *); 它不起作用。 – ambika 2010-03-15 09:12:16

+0

「不起作用」是什麼意思?我的聲明在標題中,可能不起作用。它是否在標題中? – GManNickG 2010-03-15 09:14:27

+1

我很想知道在這方面「私人」關鍵詞的含義,起初:) – 2010-03-15 09:26:59