int implícito en lenguaje c

3 minutos de lectura

int implicito en lenguaje c
Incinerador de basuras

Estoy usando orwell dev c++ IDE. Sé que en la antigüedad C89 Compatibilidad con C++ estándar y preestándar por defecto a int regla cuando el tipo de retorno de la función no se especifica explícitamente en la definición de la función. Pero ha prohibido en C++. Pero recientemente escribí siguiendo un programa C simple y funciona bien.

#include <stdio.h>
void fun();
int main(void)
{
    int a=9;
    printf("%d",a);
    printf("%d",a);
    fun();
    return 0;
}
a=1;
void fun()
{
    printf("%d",a);
}

¿Es cierto que la regla int predeterminada también se aplica a las variables? Mi compilador me muestra las siguientes advertencias.

[Warning] data definition has no type or storage class [enabled by default] 

[Warning] type defaults to 'int' in declaration of 'a' [enabled by default]

Por qué C99 el estándar todavía permite que el valor predeterminado sea int? Falla en la compilación en C++. ¿Corrígeme si estoy equivocado? Este programa en C también funciona en compiladores en línea como ideone.com

  • ¿Por qué el estándar C99 todavía permite que el valor predeterminado sea int? Supongo que si no fuera así, se rompería una gran cantidad de código antiguo.

    – R Sahu

    4 de octubre de 2014 a las 5:35

  • ¿Por qué aplicar las reglas del pasado? Slavery, Burning Witches… De todos modos, C++ y C son dos lenguajes diferentes. Simplemente tiene C en su nombre y tiene una herencia común

    – Ed Heal

    4 de octubre de 2014 a las 5:43

  • “¿Es cierto que la regla int predeterminada también se aplica a las variables?”: sí, la lista de especificadores de tipo permitidos de C90 (en 6.5.2) contenía la siguiente entrada como una de las opciones permitidas (énfasis agregado): “int, firmado, firmado ent, o sin especificadores de tipo“. C99 eliminó ese último bit.

    – Michael Burr

    4 de octubre de 2014 a las 5:54


  • Relacionado con: ¿Qué sección del estándar C89 permite la regla “int implícita”?

    – Shafik Yaghmour

    23/10/2014 a las 17:21

Esto se explica en el justificación C99:

Una nueva característica de C99:

En C89, todos los especificadores de tipo podrían omitirse de los especificadores de declaración en una declaración. En tal caso, int estaba implícito. El Comité decidió que el peligro inherente de esta función superaba su conveniencia, por lo que se eliminó. El efecto es garantizar la producción de un diagnóstico que detectará una categoría adicional de errores de programación. Después de emitir el diagnóstico, una implementación puede optar por asumir un int implícito y continuar traduciendo el programa para admitir el código fuente existente que explota esta función.

En otras palabras, se eliminó oficialmente del estándar C99, pero los compiladores aún pueden optar por seguir este comportamiento y emitir un diagnóstico, como lo hace GCC. Por ejemplo, ver su opciones de advertencia página para -Wimplicit-int. Para hacer que estas advertencias se compilen como errores, use -pedantic-errors o -Werror.

Según la respuesta de @Anonymous, c ++ 98 contiene una regla similar sobre los especificadores de tipo.

7.1.5/2

Al menos uno especificador de tipo eso no es un cv-calificador se requiere en una declaración a menos que declare un constructor, un destructor o una función de conversión.80)

80) No existe una disposición especial para una
decl-specifier-seq que carece de un especificador de tipo o que tiene un especificador de tipo que solo especifica cv-calificadores. La regla “int implícita” de C ya no se admite.

Por ejemplo, CCG es compatible con ISO/IEC 14882:1998 y superior, por lo que esto sería un error sin importar qué.

El estándar C99 no permite omitir tipos.

La Sección 6.7.2.2 dice:

Se debe proporcionar al menos un especificador de tipo en los especificadores de declaración en cada declaración, y en la lista de especificadores-calificadores en cada declaración de estructura y nombre de tipo.

¿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