Статическое объявление следует за нестатической декларацией
Я пытаюсь скомпилировать тот же файл 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, то есть найти параметр, который превратил бы эту ошибку в простое предупреждение.
Ответы
Ответ 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
}