c ошибка компиляции - PullRequest
       14

c ошибка компиляции

1 голос
/ 15 марта 2010

Это мои ошибки:

ошибка: статическое объявление 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;
  }

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 15 марта 2010

Ваши прототипы должны соответствовать вашим реальным функциям. Ваш не:

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

Либо измените прототип на:

private int doct(int*);

или измените функцию на:

int doct (int *a)

Вам также следует помнить, что private не является частью языка Си, но люди часто используют его для замены статического. Это можно сделать по линии:

#define private static

с единственным условием, что этот макрос должен быть активным везде, где вы используете имя private. Если он не работает с вашим прототипом, возможно, это потому, что он не определен на этом этапе. Мой совет - вообще отказаться от private и использовать статический (если действительно так определен private). Люди должны изучать язык, а не брать на себя ненужные костыли (по моему мнению).

Другие фавориты, которых я тоже презираю:

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

private и global используются для обозначения локального для этого файла и глобального для всех файлов соответственно. begin и end - особенно мерзкие мерзости от людей, которые должны вернуться в Паскаль, где они принадлежат: -)

В дополнение к этой проблеме, ваша строка:

static int a = 0;

на самом деле скроет параметр, который вы передаете в функцию (так как она имеет то же имя) и:

*a = a;

вызовет ошибку (так как он имеет другой тип). Это редко хорошая идея сделать это. Переименуйте один из них.

2 голосов
/ 15 марта 2010

Эта ошибка возникает, когда функция была объявлена ​​как нестатическая, а затем определенная как статическая, например:

void foo(void);

static void foo(void) {}

Сделайте static совпадением для обоих, либо удалив его из обоих, либо добавив оба. Убедитесь, что вы понимаете, что делает static.

Если ваша функция помечена static, она видна только в этой единице перевода. В вашем случае ваше объявление не имеет статического значения «эта функция будет доступна, не статично.», Но затем вы определяете ее статически.


Есть и другие ошибки. a в вашей функции скроет a в списке параметров. Вам нужно дать им разные имена. *a = a не будет работать, потому что в этой области a является целым числом, а не указателем. Используйте описательное имя, например counter для целого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...