Подтвердить что ты не робот

Статическое объявление следует за нестатической декларацией

Я пытаюсь скомпилировать тот же файл 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

AFAICT, оба имеют одинаковые CFLAGS. Я бы хотел, чтобы gcc 4.1.2 вел себя как gcc 3.2.3, то есть найти параметр, который превратил бы эту ошибку в простое предупреждение.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

static void foo (void);

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

static void foo ()
{
    // do sth
}

Ответ 3

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

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

Ответ 4

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

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
    }