Я пытаюсь скомпилировать тот же файл C на двух различных машинах с различными версиями cc.
версия 3.2.3 gcc говорит warning: 'foo' was declared implicitly 'extern' and later 'static'
версия 4.1.2 gcc говорит error: static declaration of 'foo' follows non-static declaration
У обоих есть тот же CFLAGS. Я хотел бы сделать gcc 4.1.2, ведут себя как gcc 3.2.3, то есть, найдите опцию, которая превратила бы эту ошибку в простое предупреждение.
Судя по сообщениям об ошибке, вам лучше попробовать исправить исходный код. Компилятор жалуется на различие в объявлении, как, например, в
void foo(int i);
...
void foo(double d) {
...
}
, и это недопустимый код C, поэтому компилятор жалуется.
Возможно, ваша проблема в том, что при первом использовании функции нет доступного прототипа, а компилятор неявно создает прототип, который не будет статическим. Если это так, решение состоит в том, чтобы где-нибудь добавить прототип до его первого использования.
В то время как gcc 3.2.3 более прощает проблему, gcc 4.1.2 выделяет потенциально серьезную проблему для последующего связывания вашей программы. Вместо того, чтобы пытаться подавить ошибку, вы должны сделать так, чтобы предварительное объявление соответствовало объявлению функции.
Если вы хотели, чтобы функция была доступна глобально (в соответствии с предварительным объявлением), то впоследствии не объявляйте ее статической. Точно так же, если он имеет отступ для локальной области видимости, сделайте предварительное объявление статическим для соответствия.
Попробуйте -W нетрадиционный
.
Но лучше, добавьте объявления для ваших статических функций:
static void foo (void);
// ... somewhere in code
foo ();
static void foo ()
{
// do sth
}