2012-02-07 6 views
7

Tengo un programa muy grande que compila con gcc sin advertencias¿Hay alguna manera de permitir for (int i = 0;. ... en gcc sin tener que activar el modo C99

Si giro en el modo c99 c99 = --std en la línea de comandos, se da un gran número de avisos y errores.

pero me encanta el idioma for(int i=0; i<20; i++){ code }

en lugar de {int i; for (i=0; i<20; i++){ code }}

¿hay alguna manera de ¿decirle a gcc que permita esto y solo esto?

Como alternativa, ¿hay alguna forma de habilitar el modo c99 en las funciones particulares en las que estoy trabajando? Algo así como

#pragma c99 on 

for(int i=0; i<99; i++) 
{ 
    code 
} 

#pragma c99 off 
+3

ANSI C prohíbe la mezcla de declaración y declaraciones por una razón . Deberías declarar todas tus variables en la parte superior de tu función y eso es todo. Si tiene miedo de perderlos o mezclarlos, su función tiene demasiadas líneas y debe segmentarla. – Eregrith

+2

¿Qué sucede cuando intenta compilar su código en el modo 'gnu99' (en lugar de' c99')? – NPE

+22

Este comentario significa "votar en contra" de Eregrith's. Hay buenas razones por las cuales C89 le permite definir variables en la parte superior de * cualquier * bloque, no solo un cuerpo de función como exige la guía de estilo de Eregrith. También hay buenas razones por las que algunos otros idiomas, y muy pocos idiomas modernos, tienen ese requisito. No sigas el estilo de Eregrith, incluso en C89. La razón por la cual C89 prohibió la combinación de definiciones y otras declaraciones es bastante débil: fue en gran parte histórica en 1989, y tenía que ver con viejos compiladores pesados ​​que establecían estructuras de pila de una manera bastante simple. –

Respuesta

7

Es probable que las advertencias y los errores se deben a que -std=c99 solicitudes estándar conformes C99, lo que significa que muchas de las funciones específicas de la plataforma que contaminan el espacio de nombres C99 no están definidos.

En su lugar, debe intentar --std=gnu99, que es el equivalente a C99 al modo predeterminado de gnu89.

+0

O mejor, use '-std = c99' y luego defina las macros de prueba de características correctas para las que desea usar (probablemente' -D_XOPEN_SOURCE = 700'). –

2

Como alternativa a usar -std = gnu99 Puede desactivar las advertencias individuales:

 
-Wno-declaration-after-statement 

Leer info gcc:

 
`-Wdeclaration-after-statement (C and Objective-C only)' 
    Warn when a declaration is found after a statement in a block. 
    This construct, known from C++, was introduced with ISO C99 and is 
    by default allowed in GCC. It is not supported by ISO C90 and was 
    not supported by GCC versions before GCC 3.0. *Note Mixed 
    Declarations::. 
+0

El problema es que es un * error *, no una advertencia, cuando estás en modo c89. –

Cuestiones relacionadas