2010-03-15 182 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