【问题标题】:c compilation errorc编译错误
【发布时间】:2010-03-15 08:50:07
【问题描述】:

这些是我的错误:

错误:doct 的静态声明遵循非静态声明
错误:doct 的先前声明在这里。

我的代码是:

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

有什么建议吗?

【问题讨论】:

  • 也许发布一些源代码会有所帮助?
  • 来源在哪里?我不能说太多。
  • 建议:发布一些代码,以便我们知道错误指的是什么。这与我们问“结果是 12,等式是什么?”没有什么不同
  • @GMan,人们经常“#define private static”——我不喜欢这样,但我知道它会发生。他们应该学习正确的语言,而不是像那样添加自己的 cr*p,或者 $DEITY 禁止,'#define begin {'。
  • @ambika:必须是静态的,否则你不可能得到这些错误;我保证。 private 必须static 的宏,正如我在答案中的 cmets 中提到的那样。

标签: c compiler-errors


【解决方案1】:

您的原型应该与您的实际功能相匹配。你的没有:

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

要么将原型更改为:

private int doct(int*);

或将函数更改为:

int doct (int *a)

您还应该记住,private 不是 C 语言的一部分,但人们经常用它来代替 static。这可以通过以下方式实现:

#define private static

唯一的条件是该宏必须在您使用private 名称的任何地方都处于活动状态。如果它不适用于您的原型,那可能是因为它当时没有定义。我的建议是完全放弃private 并使用静态(如果确实是private 的定义方式)。人们应该学习语言,而不是采取不必要的拐杖(在我看来)。

我也鄙视的其他最爱是:

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

privateglobal 分别用于表示此文件的本地和所有文件的全局。 beginend 对那些应该回到他们所属的 Pascal 的人来说尤其令人讨厌 :-)

除了那个问题,你的行:

static int a = 0;

实际上会隐藏您传递给函数的参数(因为它具有相同的名称)并且:

*a = a;

将导致错误(因为它具有不同的类型)。这样做很少是一个好主意。重命名其中一个。

【讨论】:

  • 我制作 int doct(int*);到私有 int doct(int*);它不起作用。
  • “不起作用”是什么意思?我您的声明在标题中,它可能不起作用。它在标题中吗?
  • 我很想知道“private”关键字在这种情况下是什么意思,首先:)
【解决方案2】:

当一个函数被声明为非静态,然后定义为静态时,就会出现这个错误,例如:

void foo(void);

static void foo(void) {}

使static 两者都匹配,方法是从两者中删除它或将其添加到两者中。确保您了解 static 的作用。

如果您的函数标记为 static,则它仅在该翻译单元中可见。在您的情况下,您的声明没有静态含义“此函数将可用,非静态。”,但是您静态定义它。


还有其他错误。函数中的a 将隐藏参数列表中的a。你需要给他们不同的名字。 *a = a 不起作用,因为在那个范围内,a 是一个整数,而不是一个指针。对整数使用描述性名称,例如 counter

【讨论】:

  • 但在我的函数中没有静态关键字。
  • @ambika:你有privateprivate不是 C 语言的一部分,所以我不能给你其他任何东西。但是,要生成该错误,private 必须是 static 的宏。即:#define private static。所以在声明中也加入“private”,或者从定义中删除“private”。我建议您使用static 而不是private,因为它会让人困惑(只需查看对这个问题的回复。:])
猜你喜欢
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2011-05-16
相关资源
最近更新 更多