Как решить статическое объявление следует за нестатическим объявлением в коде GCC C? - PullRequest
35 голосов
/ 30 июня 2010

Я пытаюсь скомпилировать один и тот же файл C на двух разных машинах с разными версиями cc.

gcc версии 3.2.3 говорит warning: 'foo' was declared implicitly 'extern' and later 'static'

gcc версия 4.1.2 говорит error: static declaration of 'foo' follows non-static declaration

Оба имеют одинаковые флаги. Я хотел бы заставить gcc 4.1.2 вести себя как gcc 3.2.3, то есть найти опцию, которая превратила бы эту ошибку в простое предупреждение.

Ответы [ 7 ]

29 голосов
/ 30 июня 2010

На что жалуется сообщение об ошибке, похоже, что вам следует попытаться исправить исходный код. Компилятор жалуется на разницу в объявлении, как например

void foo(int i);
...
void foo(double d) {
    ...
}

и это недопустимый код C, поэтому компилятор жалуется.

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

5 голосов
/ 30 июня 2010

В то время как gcc 3.2.3 более прощал проблему, gcc 4.1.2 выдвигает на первый план потенциально серьезную проблему для связывания вашей программы позже. Вместо того, чтобы пытаться подавить ошибку, вы должны сделать предварительное объявление совпадающим с объявлением функции.

Если вы намеревались сделать функцию доступной глобально (согласно предварительному объявлению), то впоследствии не объявляйте ее как статическую. Точно так же, если он имеет отступ для локальной области видимости, тогда сделайте прямое объявление статическим для соответствия.

4 голосов
/ 30 июня 2010

Попробуйте -Wno-traditional.

Но лучше добавьте объявления для ваших статических функций:

static void foo (void);

// ... somewhere in code
    foo ();

static void foo ()
{
    // do sth
}
2 голосов
/ 08 мая 2018

У меня была эта проблема в случае, когда функция static была вызвана до того, как была объявлена.Перемещение объявления функции в любое место над вызовом решило мою проблему.

1 голос
/ 11 мая 2018

Эта ошибка может быть вызвана незамкнутым набором скобок.

int main {
  doSomething {}
  doSomething else {
}

Не так легко обнаружить, даже в этом примере из 4 строк.

Эта ошибка в основной функции из 150 строк вызвала изумительную ошибку: «статическое объявление savePair следует за нестатическим объявлением».В моем определении функции savePair не было ничего плохого, это была та незамкнутая скобка.

1 голос
/ 21 декабря 2017

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

void inlet_update_my_ratio(object_t *myobject);
//some where the implementation is like this
static void inlet_update_my_ratio(object_t *myobject) {
//code
}

Если вы удалите статическое из реализации, ошибка исчезнет, ​​как показано ниже.

 void inlet_update_my_ratio(object_t *myobject) {
    //code
    }
0 голосов
/ 03 марта 2019

У меня была похожая проблема: имя функции, которое я использовал, соответствовало одной из встроенных функций, объявленных в одном из файлов заголовков, которые я включил в программу. Читая сообщение об ошибке компилятора, вы получите точный файл заголовка и функцию name.Changing имя функции решило эту проблему для меня

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