То, как решить статическое объявление, следует за нестатическим объявлением в GCC C код?

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

37
задан Ciro Santilli 新疆改造中心法轮功六四事件 25 May 2018 в 08:09
поделиться

3 ответа

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

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

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

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

29
ответ дан 27 November 2019 в 04:59
поделиться

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

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

6
ответ дан 27 November 2019 в 04:59
поделиться

Попробуйте -W нетрадиционный .

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

static void foo (void);

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

static void foo ()
{
    // do sth
}
4
ответ дан 27 November 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: