ejecutar compilar compilador como c auto c11

compilar - gcc linux



¿Por qué auto a=1; compilar en C? (7)

El tipo de compilación de Visual Studio está disponible al right click on file -> Properties -> C/C++ -> Advanced -> Compile As . Para asegurarse de que se compila como la opción C force /TC Luego, en este caso, es lo que dijo larsmans (antigua palabra clave C auto ). Puede compilarse como C ++ sin que lo sepas.

El código:

int main(void) { auto a=1; return 0; }

se compila sin errores por el compilador de MS Visual Studio 2012, cuando el archivo tiene la extensión .c. Siempre he pensado que cuando usa la extensión .c, la compilación debe ser de acuerdo con la sintaxis C, y no con C ++. Por otra parte, hasta donde sé auto sin un tipo solo se permite en C ++ desde C ++ 11, donde significa que el tipo se deduce del inicializador.

¿Eso significa que mi compilador no se está apegando a C, o es el código realmente correcto en C-language?


En C, auto significa lo mismo que el register en C ++ 11: significa que una variable tiene una duración de almacenamiento automática.

Y en C antes de C99 (y el compilador de Microsoft no es compatible con C99 o C11, aunque puede admitir partes de él), el tipo se puede omitir en muchos casos, donde se predetermina a int .

No toma el tipo del inicializador en absoluto. Acaba de elegir un inicializador que es compatible.


En C, y dialectos históricos de C ++, auto es una palabra clave que significa que tiene almacenamiento automático. Como solo se puede aplicar a variables locales, que son automáticas por defecto, nadie las usa; por lo que C ++ ahora ha reutilizado la palabra clave.

Históricamente, C ha permitido declaraciones de variables sin especificador de tipo; el tipo predeterminado es int . Entonces esta declaración es equivalente a

int a=1;

Creo que esto está en desuso (y posiblemente prohibido) en C moderna; pero algunos compiladores populares tienen un valor predeterminado de C90 (que, creo, sí lo permite) y, molestamente, solo habilita las advertencias si las solicita específicamente. Compilar con GCC y especificar C99 con -std=c99 , o habilitar la advertencia con -Wall o -Wimplicit-int , da una advertencia:

warning: type defaults to ‘int’ in declaration of ‘a’


Esto es a la vez una respuesta y un comentario extendido a No, esto no es legal C desde 1999. Ningún compilador moderno decente de C lo permite.

Sí, auto a=1; es ilegal en C1999 (y también C2011). El hecho de que esto sea ahora ilegal no significa que un compilador de C moderno deba rechazar código que contenga tales construcciones. Yo diría exactamente lo contrario, que un compilador moderno de C decente todavía debe permitir esto.

Tanto clang como gcc hacen precisamente eso al compilar el código de muestra en la pregunta en comparación con las versiones de 1999 o 2011 del estándar. Ambos compiladores emiten un diagnóstico y luego continúan como si la declaración objetable hubiera sido auto int a=1; .

En mi opinión, esto es lo que un compilador decente debería hacer. Al emitir un diagnóstico, clang y gcc son totalmente compatibles con el estándar. El estándar no dice que un compilador debe rechazar el código ilegal. El estándar simplemente dice que una implementación conforme debe producir al menos un mensaje de diagnóstico si una unidad de traducción contiene una violación de cualquier regla o restricción de sintaxis (5.1.1.3).

Dado el código que contiene construcciones ilegales, cualquier compilador decente intentará dar sentido al código ilegal para que el compilador pueda encontrar el siguiente error en el código. Un compilador que se detiene en el primer error no es un compilador muy bueno. Hay una forma de dar sentido a auto a=1 , que es aplicar la regla "implicit imp". Esta regla obliga al compilador a interpretar auto a=1 como si fuera auto int a=1 cuando el compilador se usa en el modo C90 o K & R.

La mayoría de los compiladores generalmente rechazan el código (rechazar: rechazar generar un archivo de objeto o un ejecutable) que contiene sintaxis ilegal. Este es un caso donde los autores del compilador decidieron que no compilar no es la mejor opción. Lo mejor que puede hacer es emitir un diagnóstico, corregir el código y continuar. Simplemente hay demasiado código heredado salpicado de construcciones como register a=1; . El compilador debería poder compilar ese código en el modo C99 o C11 (con un diagnóstico, por supuesto).


Una clase de almacenamiento define el alcance (visibilidad) y el tiempo de vida de las variables y / o funciones dentro de un Programa C.

Existen las siguientes clases de almacenamiento que se pueden usar en un programa C

auto register static extern

auto es la clase de almacenamiento predeterminada para todas las variables locales.

{ int Count; auto int Month; }

El ejemplo anterior define dos variables con la misma clase de almacenamiento. auto solo se puede usar dentro de funciones, es decir, variables locales.

int es el tipo predeterminado para auto en el siguiente código:

auto Month; /* Equals to */ int Month;

El siguiente código también es legal:

/* Default-int */ main() { reurn 0; }


auto es una antigua palabra clave C que significa "alcance local". auto a es lo mismo que auto int a , y como el alcance local es el predeterminado para una variable declarada dentro de una función, también es lo mismo que int a en este ejemplo.

Esta palabra clave es en realidad un remanente del predecesor B de C, donde no había tipos base: todo era int , puntero a int , matriz de int . (*) Las declaraciones serían auto o extrn [sic]. C heredó el "todo es int " como una regla predeterminada, por lo que podría declarar enteros con

auto a; extern b; static c;

ISO C se deshizo de esto, pero muchos compiladores todavía lo aceptan por compatibilidad con versiones anteriores. Si parece desconocido, entonces debes darte cuenta de que hay una regla relacionada en funcionamiento en

unsigned d; // actually unsigned int

que todavía es común en el código moderno.

C ++ 11 reutilizó la palabra clave, que pocos o ningún programador de C ++ usaba con el significado original, para su tipo de inferencia. Esto es más seguro porque la regla "todo es int " de C ya se eliminó en C ++ 98; lo único que se rompe es auto T a , que nadie estaba usando de todos modos. (En algún lugar de sus documentos sobre la historia del lenguaje , Stroustrup comenta sobre esto, pero no puedo encontrar la referencia exacta en este momento).

(*) El manejo de cadenas en B era interesante: utilizaría matrices de int y empaquetaría varios caracteres en cada miembro. B era en realidad BCPL con una sintaxis diferente.


auto tiene un significado en C y C++ antes del estándar 2011. Significa que una variable tiene un tiempo de vida automático, es decir, tiempo de vida determinado por el alcance . Esto se opone, por ejemplo, a static vida útil static , donde una variable dura "para siempre", independientemente del alcance. auto es la duración predeterminada, y casi nunca se explica explícitamente. Esta es la razón por la cual era seguro cambiar el significado en C++ .

Ahora en C , antes del estándar 99, si no especifica el tipo de una variable, se establece de manera predeterminada en int .

Entonces con auto a = 1; está declarando (y definiendo) una variable int , con duración determinada por el alcance.

("duración" se llama más apropiadamente "duración de almacenamiento", pero creo que tal vez sea menos claro).