Como corrijo o erro GCC “para declaração inicial de loop usada fora do modo C99”?


116

Estou tentando resolver o problema 3n + 1 e tenho um forloop semelhante a este:

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

Infelizmente, estou recebendo este erro quando tento compilar com o GCC:

3np1.c: 15: erro: declaração inicial do loop 'for' usada fora do modo C99

Não sei o que é o modo C99. Alguma ideia?

Respostas:


148

Eu tentaria declarar ifora do loop!

Boa sorte para resolver 3n + 1 :-)

Aqui está um exemplo:

#include <stdio.h>

int main() {

   int i;

   /* for loop execution */
   for (i = 10; i < 20; i++) {
       printf("i: %d\n", i);
   }   

   return 0;
}

Leia mais sobre loops for em C aqui .


então por que você não usa o loop while?
Erik W de

3
@ErikW sua pergunta é muito ruim
usuário25 de

118

Há uma opção de compilador que ativa o modo C99 , que entre outras coisas permite a declaração de uma variável dentro do loop for. Para ligá-lo, use a chave do compilador-std=c99

Ou, como diz @OysterD, declare a variável fora do loop.


7
na verdade, -std = gnu99 é provavelmente mais desejável, pois dessa forma você ainda obtém extensões gcc (o padrão do gcc é -std = gnu89, no entanto, isso será alterado para gnu99 em algum ponto nas próximas versões)
Spudd86 de

3
@ Spudd86: Se você deseja habilitar extensões gcc depende do que você está fazendo. Desabilitá-los é útil se seu objetivo é escrever código que seja portátil para compiladores diferentes do gcc.
Keith Thompson

21

Para mudar para o modo C99 em CodeBlocks , siga as próximas etapas:

Clique em Project / Build options , então na aba Compiler Settings, escolha a subguia Other options , coloque -std=c99na área de texto e clique em Ok .

Isso vai virar C99 modo para o seu compilador.

Espero que isso ajude alguém!


Isso ajudou no codeblocks 16.1 nas opções de outro compilador ! Embora eu tenha usado -std=gnu99como descrito em algumas respostas acima!
Ankur Shah

Mas isso ajudou temporariamente! Tenho que fazer isso toda vez que compilar o código! ... :(
Ankur Shah

Não, você não tem! Isso deve ser feito para cada novo projeto apenas uma vez.
akelec

14

Também recebi este erro.

for (int i=0;i<10;i++) { ..

não é válido no padrão C89 / C90. Como diz OysterD, você precisa fazer:

int i;
for (i=0;i<10;i++) { ..

Seu código original é permitido em C99 e padrões posteriores da linguagem C.


3
Para gcc, lance um "-std = c99". Para recursos adicionais, consulte a resposta de Imran.
Matt J de

Sim, é C válido; simplesmente não é válido C89 / C90.
Keith Thompson

@KeithThompson: esclarecido.
Blorgbeard é lançado em

Você ainda está dizendo que não é válido C, apenas com uma qualificação. É C perfeitamente válido; o padrão de 1999 substituiu e substituiu o padrão de 1990, e o padrão de 2011 substituiu e substituiu o padrão de 1999 (embora o último não existisse quando você postou esta resposta originalmente).
Keith Thompson

@KeithThompson Bem, não foi isso que pensei que estava dizendo. Você consideraria "não é válido no padrão C89 / C90" correto?
Blorgbeard é lançado em

13

@Blorgbeard :

Novos recursos no C99

  • funções inline
  • declaração de variável não mais restrita ao escopo do arquivo ou ao início de uma instrução composta
  • vários novos tipos de dados, incluindo long long int, tipos de inteiros estendidos opcionais, um tipo de dados booleano explícito e um tipo complexo para representar números complexos
  • matrizes de comprimento variável
  • suporte para comentários de uma linha começando com //, como em BCPL ou C ++
  • novas funções de biblioteca, como snprintf
  • novos arquivos de cabeçalho, como stdbool.h e inttypes.h
  • funções matemáticas genéricas de tipo (tgmath.h)
  • suporte aprimorado para ponto flutuante IEEE
  • inicializadores designados
  • literais compostos
  • suporte para macros variadic (macros de aridade variável)
  • restrinja a qualificação para permitir uma otimização de código mais agressiva

http://en.wikipedia.org/wiki/C99

Um tour pelo C99



3

Para qualquer um que tente compilar o código de uma fonte externa que usa um utilitário de compilação automatizado como o Make , para evitar ter que rastrear as chamadas de compilação gcc explícitas, você pode definir uma variável de ambiente. Digite no prompt de comando ou coloque .bashrc (ou .bash_profile no Mac):

export CFLAGS="-std=c99"

Observe que uma solução semelhante se aplica se você se deparar com um cenário semelhante com a compilação C ++ que requer C ++ 11, você pode usar:

export CXXFLAGS="-std=c++11"

1

Tive o mesmo problema e funciona, basta declarar o ilado de fora do loop:

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}

1

Jihene Stambouli respondeu à pergunta do OP mais diretamente ... A pergunta era; porque

for(int i = low; i <= high; ++i)
{
    res = runalg(i);
    if (res > highestres)
    {
        highestres = res;
    }
}

produzir o erro;

3np1.c:15: error: 'for' loop initial declaration used outside C99 mode

para o qual a resposta é

for(int i = low...

deveria estar

int i;
for (i=low...

1

Ative o modo C99 em Code :: Blocks 16.01

  • Vá para Configurações -> Compilador ...
  • Na seção Sinalizadores do compilador da guia Configurações do compilador , marque a caixa de seleção ' Faça com que o gcc siga o padrão de linguagem ISO C de 1999 [-std = c99] '

0

Para o Qt-creator: basta adicionar as próximas linhas ao arquivo * .pro ...

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.