Cómo usar el estándar C11 en Code::Blocks

8 minutos de lectura

Como usar el estandar C11 en CodeBlocks
michi

Como dice el título, necesito hacer code::blocks trabajar con C11 y no se como hacerlo.

fui a settings => compiler settings => Other options y agregué -std=c11 y probé también con -std=gnu11ambos no parecen funcionar.

compilé gcc-5.2 y luego cambié el compilador predeterminado (gcc-4.9) y todavía no hay resultado.


Cuando trato de compilar el siguiente programa:

#include<stdio.h>

int main(void){
    int arr[] = {0,1,2,3,4};

    for(int i=0;i<5;i++){
        printf("%d ",arr[i]);
    }

    return 0;
}

me sale lo siguiente:

|6|error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode|

Pero si lo hago en terminal (ubuntu 15.04, 64BIT, gcc-5.2):

./install/gcc-5.2.0/bin/gcc5.2 program.c -o program

Parece funcionar bien.

mi pregunta es como hacer code::blocks trabajar con c11 ?

  • Dado que las versiones GCC 5.x se ejecutan con -std=gnu11 por defecto, Code::Blocks debe estar haciendo algo (como pasar -ansi o -std=gnu90) al compilador para que funcione de manera diferente. Investigue todas las opciones que se envían al compilador. Encuentre una manera de que Code::Blocks le muestre el conjuro exacto que usa al compilar. Luego averigüe cómo solucionarlo. (No he usado Code::Blocks, así que no puedo ser más útil que eso, suponiendo que esto sea de alguna ayuda).

    –Jonathan Leffler

    8 dic 2015 a las 18:33


  • @JonathanLeffler Estas son las opciones que se usan =>> -Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -std=gnu11 -O0 -g -ansi pkg-config --cflags gtk+-3.0

    – Michi

    8 dic 2015 a las 18:33


  • los -ansi está haciendo el daño; es equivalente a -std=c90 o quizás -std=gnu90 — se deshace explícitamente -std=c11 o -std=gnu11. (Y, para su información, puede incrustar comillas inversas en el bloque de código de un comentario usando dos para comenzar y terminar y una en el medio: -Wall … `pkg-config --cflags gtk+-3.0` – como eso.

    –Jonathan Leffler

    8 dic 2015 a las 18:34


  • @JonathanLeffler Gracias, tienes razón, -ansi era el problema Pensé que también necesito esa opción, quiero decir -ansi

    – Michi

    08/12/2015 a las 18:36


1647626709 972 Como usar el estandar C11 en CodeBlocks
jonathan leffler

Dado que las versiones GCC 5.x se ejecutan con -std=gnu11 por defecto, Code::Blocks debe estar haciendo algo (como pasar -ansi o -std=gnu90) al compilador para que funcione de manera diferente.

Investigue todas las opciones que se envían al compilador. Encuentre una manera de que Code::Blocks le muestre el conjuro exacto que usa al compilar. Luego averigüe cómo solucionarlo.

Las opciones que se utilizan son:

-Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -std=gnu11 \
-O0 -g -ansi `pkg-config --cflags gtk+-3.0`

los -ansi está haciendo el daño; es equivalente a -std=c90 o quizás -std=gnu90 — se deshace explícitamente -std=c11 o -std=gnu11.

  • No sabía, espero que las otras banderas estén bien.

    – Michi

    8 dic 2015 a las 18:41

  • Si, aunque el -O0 no es uno que normalmente usaría. Rutinariamente uso -O3 -g. Agrego algunos: -Wmissing-prototypes -Wold-style-definition, y a veces añaden otros. Una vez que pierdes el -ansilo que tienes es factible aunque posiblemente un poco subóptimo (porque -O0 significa optimización mínima).

    –Jonathan Leffler

    8 dic 2015 a las 18:44

  • La razón principal por la que uso -O0 es por esto =>> Por favor, eche un vistazo

    – Michi

    8 dic 2015 a las 18:47

  • Mmm interesante. Compilar con -O0 de modo que incluso si su programa es tan simple que GCC puede optimizar sus pérdidas de memoria, todavía se detectan porque no están optimizadas. Si la memoria no se pierde porque el compilador detecta que no necesita asignar la memoria, ¿sigue siendo una fuga? (¿Y un árbol que cae en el bosque hace un sonido cuando no hay nadie allí para escucharlo?) Es interesante lo sofisticado que es el optimizador. No estoy seguro de si usaría -O0 muy a menudo sólo por eso. Gracias por la referencia x.

    –Jonathan Leffler

    08/12/2015 a las 18:55

  • No creo que esto funcione con la instalación predeterminada de Codeblocks, porque usa una versión anterior de GCC. Instalé Codeblocks hace medio año y luego tuve que decirle manualmente que usara un GCC diferente. Como esto era para Windows, tuve que señalar la instalación de MinGW 64.

    – Lundin

    11 de diciembre de 2015 a las 9:33

Asumiendo Codeblocks 13.12 para Windows, viene con una versión anterior de GCC (4.7.1) que no es compatible con C11.

  • Descargue manualmente la última versión del compilador Mingw 64 (no creo que Mingw32 se mantenga para incluir versiones GCC de C11).
  • Instalarlo. Terminará en alguna carpeta oscura como C:\Program Files\mingw-w64\x86_64-4.9.1-win32-seh-rt_v3-rev1\mingw64.
  • Agregue la ruta anterior en Codeblocks, Configuración -> Compilador -> Pestaña de ejecutables de Toolchain -> Directorio de instalación del compilador. Haga clic en el botón “detección automática”.
  • En la misma pestaña, verifique que el compilador de C esté x86_64-w64-mingw32-gcc.exe (ya que ahora puede tener múltiples instalaciones de GCC en su computadora) y que el programa make es mingw32-make.exe.
  • En la pestaña Configuración del compilador, haga clic derecho en la lista de indicadores del compilador y seleccione “Nuevo indicador”. Para “nombre” escriba en C11, para las banderas del compilador escriba -std=c11. Haga clic en Aceptar y marque la nueva opción C11 que acaba de crear.
  • Además, para garantizar la conformidad con C11, marque la opción “tratar los errores como las advertencias exigidas por ISO C…” (-pedante-errores). Marque la opción “Habilitar todas las advertencias comunes del compilador” (-Wall).

  • Gracias por su respuesta, será bueno para alguien que trabaja con productos de Microsoft (Windows), pero yo soy un usuario de Linux desde 2004. Expliqué en mi pregunta que uso ubuntu 15.04, 64BIT, gcc-5.2. De cualquier manera +1 por tu respuesta.

    – Michi

    11 de diciembre de 2015 a las 13:39

  • @Michi Sin embargo, la forma de configurar Codeblocks para elegir un compilador diferente y configurarlo para compilar de acuerdo con C11 debería ser la misma en Ubuntu. Probablemente mucho más fácil, ya que no tienes que pasar por el alboroto de instalación de Mingw. De todos modos, parece que está agregando opciones de compilación de manera incorrecta, esta respuesta explica cómo debe configurar Codeblocks para compilar para C11.

    – Lundin

    11 de diciembre de 2015 a las 14:35


  • Esta -Wall -Wextra -Werror -Wstrict-prototypes -Wconversion -Wmissing-prototypes -Wold-style-definition -std=c11 -O0 -g son mis opciones de compilador, pero había usado -ansi y no sabía que eso entra en conflicto con -std=c11.

    – Michi

    11 de diciembre de 2015 a las 15:26


Como usar el estandar C11 en CodeBlocks
1565986223

Solo soy un aprendiz (principiante, muy nuevo), pero espero que esto pueda ayudar (aunque el hilo es antiguo).

(el código visible en la imagen es el ejemplo 12.2 — forc99.c de Stephen Prata C Primer Plus)

código_bloques_16.01

Creé una nueva bandera

Configuración -> Compilador -> (en general) Haga clic derecho en general -> Nueva bandera -> Ingrese los detalles de la imagen -> Ok Después de eso, marque la casilla de la nueva bandera que acaba de crear. (trabajó para mi)

[If you look in the image there is option for -std=c99 (just above the one I created), You can use that option for c99 support.]

(Por cierto, la versión gcc para code::blocks 16.01 mingw 32bit, yo uso esta, es 4.9.2)

Vaya a Configuración-> compilador-> Indicadores del compilador-> General-> marque la casilla junto a “Hacer que g ++ siga el c ++ 11 ISO” ¡HECHO!

1647626710 770 Como usar el estandar C11 en CodeBlocks
chandan kumar

También enfrenté el mismo problema en mi CodeBlock Project. Estoy usando la versión CodeBlock Versión: 17.12.

Lo arreglé con los siguientes pasos:

  1. Vaya a Configuración -> Pestaña Compilador.
  2. “Configuración global del compilador:” pop es openend.
  3. Compruebe el compilador seleccionado: “Compilador GNU GCC”
  4. Seleccione la pestaña “Bandera del compilador”.
  5. Seleccione las siguientes casillas de verificación:
    • Haga que g ++ siga el estándar de lenguaje C ++ 11 ISO C ++
    • Hacer que gcc siga el estándar de lenguaje ISO C de 2011
  6. Guarde la configuración.
  7. Ahora puedo cumplir con el código C++ 11.

Espero que funcione para ustedes también.

1647626710 555 Como usar el estandar C11 en CodeBlocks
chandraprakash-dev

Vaya a Configuración -> Configuración del compilador

1647626711 780 Como usar el estandar C11 en CodeBlocks

Asegúrese de que la configuración global del compilador en la pestaña izquierda esté seleccionada.

ingrese la descripción de la imagen aquí

En la pestaña derecha, haga clic en la pestaña Configuración del compilador. En general, marque la casilla contra “Hacer que gcc siga el estándar de lenguaje ISO C de 1999 [-std=c99]

ingrese la descripción de la imagen aquí

Como usar el estandar C11 en CodeBlocks
Ayesha Gupta

La razón es porque estás declarando i en for loop. Intenta separarlo como se muestra a continuación:

#include<stdio.h>

    int main(void)

        {
            int arr[] = {0,1,2,3,4};
            int i;
            for(i=0;i<5;i++){
                printf("%d ",arr[i]);
            }

            return 0;
        }

Funcionará. Feliz codificación 🙂

  • Te voté porque hoy cometí el mismo error que tú ahora, viendo un Código sin leer toda la Pregunta. Lea la pregunta nuevamente y haga una buena respuesta al respecto. 🙂

    – Michi

    11 de agosto de 2016 a las 15:27

  • No hay nada malo con el código, la pregunta es sobre C11. ¿Sabes lo que es C11, o incluso C99? Esto no responde la pregunta, ni siquiera está relacionado con la pregunta.

    – Lundin

    12 de agosto de 2016 a las 7:44


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad