versiones compiler c++ keyword c++03

compiler - ¿Hay alguna razón para usar la palabra clave ''auto'' en C++ 03?



c++14 (10)

"auto" supuestamente le dice al compilador que decida por sí mismo dónde colocar la variable (memoria o registro). Su análogo es "registrar", que supuestamente le dice al compilador que intente mantenerlo en un registro. Los compiladores modernos ignoran ambos, por lo que tú también deberías.

Tenga en cuenta que esta pregunta se publicó originalmente en 2009, antes de que se ratificara C ++ 11 y antes de que el significado de la palabra clave auto cambiara drásticamente. Las respuestas proporcionadas pertenecen solo al significado de C ++ 03 de auto , que es una clase de almacenamiento especificada, y no el significado de C ++ 11 de auto , que es la deducción automática de tipo. Si está buscando consejos sobre cuándo usar el C ++ 11 auto , esta pregunta no es relevante para esa pregunta.

Durante mucho tiempo, pensé que no había ninguna razón para usar la palabra clave static en C, porque las variables declaradas fuera del ámbito del bloque eran implícitamente globales. Luego descubrí que declarar una variable como static dentro de bloque-scope le daría una duración permanente, y declararlo fuera del alcance del bloque (en el ámbito del programa) le daría el alcance del archivo (solo se puede acceder en esa unidad de compilación).

Así que esto me deja con una sola palabra clave que yo (tal vez) aún no entiendo completamente: auto palabra clave auto . ¿Hay algún otro significado aparte de ''variable local''? ¿Hay algo que haga que no esté hecho implícitamente para usted donde quiera que quiera usarlo? ¿Cómo se comporta una variable auto en el alcance del programa? ¿Qué pasa con una variable static auto en el alcance del archivo? ¿Tiene esta palabra clave algún propósito que no sea el de existir para completar ?


El nuevo significado de la palabra clave auto en C ++ 0x se describe muy bien por Stephan T. Lavavej de Microsoft en una conferencia de video descargable y de libre acceso en STL que se encuentra en el sitio de Channel 9 de MSDN here .

Vale la pena ver la conferencia en su totalidad, pero la parte sobre la palabra clave auto está en la marca del minuto 29 (aproximadamente).


En C ++ 11, el auto tiene un nuevo significado: le permite deducir automáticamente el tipo de una variable.

¿Por qué es eso alguna vez útil? Consideremos un ejemplo básico:

std::list<int> a; // fill in a for (auto it = a.begin(); it != a.end(); ++it) { // Do stuff here }

El auto allí crea un iterador de tipo std::list<int>::iterator .

Esto puede hacer que algún código seriamente complejo sea mucho más fácil de leer.

Otro ejemplo:

int x, y; auto f = [&]{ x += y; }; f(); f();

Allí, el auto dedujo el tipo requerido para almacenar una expresión lambda en una variable. Wikipedia tiene una buena cobertura sobre el tema.


En el viejo compilador, el auto era una forma de declarar una variable local. No puede declarar variables locales en compiladores antiguos como Turbo C sin la palabra clave auto o algo así.


GCC tiene un uso especial de auto para funciones anidadas - mira here .

Si tiene una función anidada a la que desea llamar antes de su definición, debe declararla auto .


La palabra clave auto no tiene ningún propósito en este momento. Tiene razón al decir que solo actualiza la clase de almacenamiento predeterminada de una variable local, la alternativa realmente útil es static .

Tiene un nuevo significado en C ++ 0x. ¡Eso te da una idea de cuán inútil era!


Según Stroustrup, en "The C Programming Language" (4ª edición, que cubre C 11), el uso de ''auto'' tiene las siguientes razones principales (sección 2.2.2) (se citan las palabras de Stroustrup):

1)

La definición se encuentra en un amplio ámbito en el que queremos que el tipo sea claramente visible para los lectores de nuestro código.

¡Con ''auto'' y su inicializador necesario podemos conocer el tipo de variable de un vistazo!

2)

Queremos ser explícitos sobre el rango o la precisión de la variable (p. Ej., Doble en lugar de flotar)

En mi opinión, un caso que se ajusta aquí, es algo como esto:

double square(double d) { return d*d; } int square(int d) { return d*d; } auto a1 = square(3); cout << a1 << endl; a1 = square(3.3); cout << a1 << endl;

3)

Usando ''auto'' evitamos la redundancia y escribir nombres de tipo largos.

Imagine un nombre de tipo largo de un iterador con plantilla:

(código de la sección 6.3.6.1)

template<class T> void f1(vector<T>& arg) { for (typename vector<T>::iterator p = arg.begin(); p != arg.end(); p) *p = 7; for (auto p = arg.begin(); p != arg.end(); p) *p = 7; }


Utilizo esta palabra clave para documentar explícitamente cuándo es crítico para la función, que la variable se coloque en la pila, para procesadores basados ​​en pila. Esta función puede ser necesaria al modificar la pila antes de regresar de una función (o rutina de servicio de interrupción). En este caso declaro:

auto unsigned int auiStack[1]; //variable must be on stack

Y luego accedo fuera de la variable:

#define OFFSET_TO_RETURN_ADDRESS 8 //depends on compiler operation and current automatics auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;

Entonces la palabra clave auto ayuda a documentar el intento.


auto es un especificador de clase de almacenamiento, static , de register y extern también. Solo puedes usar uno de estos cuatro en una declaración.

Las variables locales (sin static ) tienen una duración de almacenamiento automática, lo que significa que viven desde el inicio de su definición hasta el final de su bloque. Poner el auto delante de ellos es redundante ya que es el valor predeterminado de todos modos.

No conozco ninguna razón para usarlo en C ++. En las versiones antiguas de C que tienen la regla int implícita, puede usarla para declarar una variable

int main(void) { auto i = 1; }

Para hacer que sea una sintaxis válida o una desambiguación de una expresión de asignación en caso de que i esté dentro del alcance. Pero esto no funciona en C ++ de todos modos (debe especificar un tipo). Bastante gracioso, el Estándar C ++ escribe:

Un objeto declarado sin un especificador de clase de almacenamiento en el ámbito del bloque o declarado como un parámetro de función tiene una duración de almacenamiento automático por defecto. [Nota: por lo tanto, el especificador automático casi siempre es redundante y no se utiliza con frecuencia; un uso de auto es distinguir explícitamente un enunciado de declaración de un enunciado de expresión (6.8). -finalizar nota]

Lo cual se refiere al siguiente escenario, que podría ser un molde de a a int o la declaración de una variable a de tipo int con paréntesis redundantes alrededor de a . Siempre se toma como una declaración, por lo que auto no agregaría nada útil aquí, pero lo haría para el humano, en cambio. Pero, una vez más, diría que sería mejor para el ser humano eliminar los paréntesis redundantes en torno a a .

int(a);

Con el nuevo significado de auto llega con C ++ 0x, desaconsejaría usarlo con el significado de C ++ 03 en el código.


¿Hay algún otro significado para ''auto'' que no sea ''variable local''?

No en C ++ 03.

¿Hay algo que haga que no esté hecho implícitamente para usted donde quiera que quiera usarlo?

Nada en absoluto, en C ++ 03.

¿Cómo se comporta una variable automática en el alcance del programa? ¿Qué pasa con una variable automática estática en el alcance del archivo?

Palabra clave no permitida fuera de un cuerpo de función / método.

¿Esta palabra clave tiene algún propósito [en C ++ 03] que no sea solo la existencia de integridad?

Sorprendentemente, sí. Los criterios de diseño de C ++ incluían un alto grado de compatibilidad con C. tenía esta palabra clave y no había una razón real para prohibirla o redefinir su significado en C ++. Entonces, el propósito era una incompatibilidad menor con C.

¿Esta palabra clave tiene algún propósito en C que no sea solo existente para completar?

Aprendí uno solo recientemente: la facilidad de migración de antiguos programas de B. C evolucionó a partir de un lenguaje llamado B cuya sintaxis era bastante similar a la de C. Sin embargo, B no tenía ningún tipo de ningún tipo. La única forma de declarar una variable en B era especificar su tipo de almacenamiento ( auto o extern ). Me gusta esto:

auto i;

Esta sintaxis aún funciona en C y es equivalente a

int i;

porque en C, la clase de almacenamiento está predeterminada en auto , y el tipo predeterminado es int . Supongo que cada programa que se originó en B y se transfirió a C estaba literalmente lleno de variables auto en ese momento.

C ++ 03 ya no permite el estilo C implícito int, pero conserva la palabra clave auto ya no es exactamente útil porque, a diferencia de la int implícita, no se sabe que cause ningún problema en la sintaxis de C.