En mi época universitaria leí sobre la auto
palabra clave y con el tiempo me olvidé de lo que es. Se define como:
define una variable local que tiene una vida útil local
Nunca encontré que se esté usando en ningún lugar, ¿se usa realmente y, de ser así, dónde se usa y en qué casos?
auto
se pueda especificar pero no sucederá de forma predeterminada?auto
. tigcc.ticalc.org/doc/keywords.html#auto_Thread_local
detalles: en.cppreference.com/w/c/language/storage_duration y stackoverflow.com/a/14289720/6557621Si hubiera leído la lista de IAQ (preguntas infrecuentes), sabría que el automóvil es útil principalmente para definir o declarar un vehículo:
Un vehículo que se estaciona constantemente al aire libre:
Para aquellos que carecen de sentido del humor y quieren "solo los hechos, señora": la respuesta corta es que nunca hay ninguna razón para usar
auto
. La única vez que se le permite usarauto
es con una variable que ya tieneauto
una clase de almacenamiento, por lo que solo está especificando algo que sucedería de todos modos. Si intenta utilizarauto
en cualquier variable que no tenga laauto
clase de almacenamiento, el compilador rechazará su código. Supongo que si quiere ponerse técnico, su implementación no tiene que ser un compilador (pero lo es) y teóricamente puede continuar compilando el código después de emitir un diagnóstico (pero no lo será).Pequeño anexo de kaz :
También hay:
lo que requiere un diagnóstico según ISO C. Esto es correcto, porque declara que el coche está averiado. El diagnóstico es gratuito, pero apagar la luz del tablero le costará ochenta dólares. (Veinte o menos, si compra su propio dongle USB para diagnóstico a bordo en eBay).
Lo anterior
extern auto my_car
también requiere un diagnóstico, y por esa razón nunca se ejecuta a través del compilador, excepto por el personal de la ciudad encargado de hacer cumplir la ley de estacionamiento.Si ve mucho
extern static auto ...
en cualquier base de código, está en un mal vecindario; busque un trabajo mejor inmediatamente, antes de que todo el lugar se convierta en Rust.fuente
char auto my_car;
La
auto
palabra clave es inútil en el lenguaje C. Está ahí porque antes del lenguaje C existía un lenguaje B en el que esa palabra clave era necesaria para declarar variables locales. (B se convirtió en NB, que se convirtió en C).Aquí está el manual de referencia para B .
Como puede ver, el manual está plagado de ejemplos en los que
auto
se utiliza. Esto es así porque no existe unaint
palabra clave. Se necesita algún tipo de palabra clave para decir "esto es una declaración de una variable", y esa palabra clave también indica si es local o externa (auto
versusextrn
). Si no usa uno u otro, tiene un error de sintaxis. Es decir,x, y;
no es una declaración en sí misma, sino que loauto x, y;
es.Dado que las bases de código escritas en B tenían que ser trasladadas a NB y a C a medida que se desarrollaba el lenguaje, las versiones más nuevas del lenguaje llevaban algo de equipaje para mejorar la compatibilidad con versiones anteriores que se traducía en menos trabajo. En el caso de
auto
, los programadores no tuvieron que buscar cada apariciónauto
y eliminarlo.Es obvio a partir del manual que el ahora obsoleto "implícito int" cruft en C (poder escribir
main() { ... }
sin ningunoint
al frente) también proviene de B. Esa es otra característica de compatibilidad con versiones anteriores para admitir el código B. Las funciones no tienen un tipo de retorno especificado en B porque no hay tipos. Todo es una palabra, como en muchos lenguajes ensambladores.Observe cómo una función puede simplemente declararse
extrn putchar
y luego lo único que la convierte en una función que usa el identificador : se usa en una expresión de llamada de función comoputchar(x)
, y eso es lo que le dice al compilador que trate esa palabra sin tipo como un puntero de función.fuente
En C
auto
es una palabra clave que indica que una variable es local a un bloque. Dado que ese es el valor predeterminado para las variables de ámbito de bloque, es innecesario y se usa muy raramente (no creo que lo haya visto usar fuera de los ejemplos en los textos que discuten la palabra clave). Me interesaría si alguien pudiera señalar un caso en el queauto
se requiera el uso de para obtener un análisis o comportamiento correcto.Sin embargo, en el estándar C ++ 11, la
auto
palabra clave ha sido 'secuestrada' para admitir la inferencia de tipos, donde el tipo de una variable se puede tomar del tipo de su inicializador:La inferencia de tipos se está agregando principalmente para admitir la declaración de variables en plantillas o la devolución de funciones de plantilla donde los tipos basados en un parámetro de plantilla (o deducidos por el compilador cuando se crea una instancia de una plantilla) a menudo pueden ser bastante dolorosos de declarar manualmente.
fuente
auto
se trata de una clase de almacenamiento que no tiene nada que ver con la visibilidad.Con el antiguo compilador Aztec C, era posible convertir todas las variables automáticas en variables estáticas (para aumentar la velocidad de direccionamiento) mediante un conmutador de línea de comandos.
Pero las variables declaradas explícitamente con
auto
se dejaron como están en ese caso. (¡Imprescindible para funciones recursivas que de otro modo no funcionarían correctamente!)fuente
La
auto
palabra clave es similar a la inclusión de punto y coma en Python, era requerida por un lenguaje anterior (B
) pero los desarrolladores se dieron cuenta de que era redundante porque la mayoría de las cosas lo eranauto
.Sospecho que se dejó para ayudar con la transición de B a C. En resumen, un uso es para la compatibilidad con el lenguaje B.
Por ejemplo en B y 80 C:
fuente
La palabra clave auto es un ejemplo de clase de almacenamiento (algún tipo de técnica que decide la vida útil de la variable y el lugar de almacenamiento). Tiene un comportamiento por el cual la variable creada por la Ayuda de esa palabra clave tiene una vida útil (vida útil) que reside solo entre las llaves
fuente
auto
solo se puede utilizar para variables de ámbito de bloque.extern auto int
es una tontería porque el compilador no puede determinar si esto usa una definición externa o si anular la extern con una definición automática (también auto y extern son duraciones de almacenamiento completamente diferentes, comostatic auto int
, lo cual también es una tontería obviamente). Siempre puede optar por interpretarlo de una manera, pero en su lugar opta por tratarlo como un error.Hay una característica que
auto
proporciona y que habilita la regla 'todo es un int' dentro de una función. A diferencia de fuera de una función, dondea=3
se interpreta como una definiciónint a =3
porque las asignaciones no existen en el alcance del archivo,a=3
es un error dentro de una función porque aparentemente el compilador siempre lo interpreta como una asignación a una variable externa en lugar de una definición (incluso si hay hayextern int a
declaraciones adelantadas en la función o en el ámbito de archivo), pero un especificador comostatic
,const
,volatile
oauto
que implica que se trata de una definición y el compilador lo toma como una definición, exceptoauto
no tiene los efectos secundarios de los otros especificadores.auto a=3
es, por tanto, implícitamenteauto int a = 3
. Cierto es que,signed a = 3
tiene el mismo efecto yunsigned a = 3
siempre es un int sin firmar.También tenga en cuenta que '
auto
no tiene ningún efecto sobre si un objeto se asignará a un registro (a menos que algún compilador en particular le preste atención, pero eso parece poco probable)'fuente
Estoy seguro de que está familiarizado con los especificadores de clases de almacenamiento en C, que son "extern", "static", "register" y "auto". La definición de "auto" se da prácticamente en otras respuestas, pero aquí hay un posible uso de la palabra clave "auto" que no estoy seguro, pero creo que depende del compilador. Verá, con respecto a los especificadores de clases de almacenamiento, hay una regla. No podemos utilizar varios especificadores de clases de almacenamiento para una variable. Es por eso que las variables globales estáticas no se pueden eliminar. Por lo tanto, solo los conoce su archivo. Cuando vaya a la configuración de su compilador, puede habilitar el indicador de optimización para la velocidad. una de las formas en que el compilador optimiza es, busca variables sin especificadores de clase de almacenamiento y luego realiza una evaluación basada en la disponibilidad de la memoria caché y algunos otros factores para ver si debe tratar esa variable usando un especificador de registro o no. Ahora, ¿qué pasa si queremos optimizar nuestro código para la velocidad sabiendo que una variable específica en nuestro programa no es muy importante y no queremos que el compilador ni siquiera la considere como un registro? Sin embargo, al poner auto, el compilador no podrá agregar un especificador de registro a una variable ya que escribe "register auto int a;" O "registro automático int a;" plantea el error de utilizar varios especificadores de clase de almacenamiento. Para resumir, pensé que auto puede prohibir que el compilador trate una variable como registro a través de la optimización. ¿Qué pasa si queremos optimizar nuestro código para la velocidad sabiendo que una variable específica en nuestro programa no es muy importante y no queremos que el compilador ni siquiera la considere como registro? Sin embargo, al poner auto, el compilador no podrá agregar un especificador de registro a una variable ya que escribe "register auto int a;" O "registro automático int a;" plantea el error de utilizar varios especificadores de clase de almacenamiento. Para resumir, pensé que auto puede prohibir que el compilador trate una variable como registro a través de la optimización. ¿Qué pasa si queremos optimizar nuestro código para la velocidad sabiendo que una variable específica en nuestro programa no es muy importante y no queremos que el compilador ni siquiera la considere como registro? Sin embargo, al poner auto, el compilador no podrá agregar un especificador de registro a una variable ya que escribe "register auto int a;" O "registro automático int a;" plantea el error de utilizar varios especificadores de clase de almacenamiento. Para resumir, pensé que auto puede prohibir que el compilador trate una variable como registro a través de la optimización. plantea el error de utilizar varios especificadores de clase de almacenamiento. Para resumir, pensé que auto puede prohibir que el compilador trate una variable como registro a través de la optimización. plantea el error de utilizar varios especificadores de clase de almacenamiento. Para resumir, pensé que auto puede prohibir que el compilador trate una variable como registro a través de la optimización.
Esta teoría no funcionó para el compilador GCC, sin embargo, no he probado otros compiladores.
fuente