¿Por qué no debería #incluir <bits / stdc ++. H>?

301
Lightness Races in Orbit 2015-08-05 07:57.

Publiqué una pregunta con mi código cuya única #includedirectiva era la siguiente:

#include <bits/stdc++.h>

Mi profesor me dijo que hiciera esto, pero en la sección de comentarios me informaron que no debía hacerlo.

¿Por qué?

5 answers

349
Lightness Races in Orbit 2015-08-05 07:57.

La inclusión <bits/stdc++.h>parece ser algo cada vez más común de ver en Stack Overflow, quizás algo recientemente agregado a un plan de estudios nacional en el año académico actual.

Me imagino que las ventajas se dan vagamente así:

  • Solo necesitas escribir una #includelínea
  • No es necesario buscar en qué encabezado estándar está todo

Desafortunadamente, este es un truco perezoso, nombrando un encabezado interno de GCC directamente en lugar de encabezados estándar individuales como <string>, <iostream>y <vector>. Arruina la portabilidad y fomenta hábitos terribles.

Las desventajas incluyen:

  • Probablemente solo funcione en ese compilador
  • No tiene idea de lo que hará cuando lo use, porque su contenido no está establecido por un estándar
  • Incluso actualizar su compilador a su propia próxima versión puede romper su programa
  • Cada encabezado estándar debe analizarse y compilarse junto con su código fuente, que es lento y da como resultado un ejecutable voluminoso bajo ciertas configuraciones de compilación

¡No lo hagas!


Más información:

Ejemplo de por qué Quora es malo:

67
Unslander Monica 2015-08-07 06:50.

¿Por qué? Porque se usa como si se suponiera que fuera un encabezado estándar de C ++, pero ningún estándar lo menciona. Entonces, su código no es portátil por construcción. No encontrará ninguna documentación al respecto en cppreference . Así que bien podría no existir. Es producto de la imaginación de alguien :)

He descubierto, para mi horror e incredulidad, que hay un sitio de tutoriales muy conocido en el que cada ejemplo de C ++ parece incluir este encabezado . El mundo está loco. Esa es la prueba.


Para cualquiera que escriba tales "tutoriales"

Deje de usar este encabezado. Olvídalo. No propague esta locura. Si no está dispuesto a entender por qué hacer esto está mal , confíe en mi palabra. No me parece bien que me traten como una figura de autoridad en nada en absoluto, y probablemente estoy lleno de eso la mitad del tiempo, pero haré una excepción solo en este caso. Afirmo que sé de lo que estoy hablando aquí. Confía en mi palabra. Te lo imploro.

PD: Puedo imaginarme bien el abominable "estándar de enseñanza" donde pudo haber tenido lugar esta malvada idea, y las circunstancias que la llevaron. El hecho de que parezca haber una necesidad práctica no lo hace aceptable, ni siquiera en retrospectiva.

PPS No, no había ninguna necesidad práctica. No hay muchos encabezados estándar de C ++ y están bien documentados. Si enseñas, les estás haciendo un flaco favor a tus estudiantes al agregar esa "magia". Producir programadores con una mentalidad mágica es lo último que queremos. Si necesita ofrecer a los estudiantes un subconjunto de C ++ para hacerles la vida más fácil, simplemente produzca un folleto con la lista breve de encabezados aplicables al curso que enseña y con documentación concisa para las construcciones de la biblioteca que espera que los estudiantes usen.

45
RedGreenCode 2019-04-23 15:09.

Hay un sitio de Stack Exchange llamado Programming Puzzles & Code Golf . Los acertijos de programación en ese sitio se ajustan a esta definición de acertijo :

un juguete, problema u otro artilugio diseñado para divertir al presentar dificultades que deben resolverse con ingenio o esfuerzo paciente.

Están diseñados para divertir, y no de la forma en que un programador en activo podría divertirse con un problema del mundo real que se encuentra en su trabajo diario.

Code Golf es "un tipo de competencia de programación informática recreativa en la que los participantes se esfuerzan por lograr el código fuente más corto posible que implemente cierto algoritmo". En las respuestas del sitio de PP&CG, verá que las personas especifican la cantidad de bytes en sus respuestas. Cuando encuentren una manera de recortar algunos bytes, tacharán el número original y registrarán el nuevo.

Como era de esperar, el golf de código recompensa el abuso extremo del lenguaje de programación. Nombres de variables de una letra. Sin espacios en blanco. Uso creativo de las funciones de la biblioteca. Funciones indocumentadas. Prácticas de programación no estándar. Hacks espantosos.

Si un programador envía una solicitud de extracción en el trabajo que contiene un código de estilo golf, sería rechazada. Sus compañeros de trabajo se reirían de ellos. Su gerente pasaba por su escritorio para charlar. Aun así, los programadores se divierten enviando respuestas a PP&CG.

¿Qué tiene esto que ver stdc++.h? Como han señalado otros, usarlo es perezoso. No es portátil, por lo que no sabe si funcionará en su compilador o en la próxima versión de su compilador. Fomenta malos hábitos. No es estándar, por lo que el comportamiento de su programa puede diferir de lo esperado. Puede aumentar el tiempo de compilación y el tamaño del ejecutable.

Todas estas son objeciones válidas y correctas. Entonces, ¿por qué alguien usaría esta monstruosidad?

Resulta que a algunas personas les gusta programar acertijos sin el código golf . Se reúnen y compiten en eventos como ACM-ICPC, Google Code Jam y Facebook Hacker Cup, o en sitios como Topcoder y Codeforces. Su rango se basa en la corrección del programa, la velocidad de ejecución y la rapidez con la que envían una solución. Para maximizar la velocidad de ejecución, muchos participantes utilizan C ++. Para maximizar la velocidad de codificación, algunos de ellos usan stdc++.h.

¿Es esto una buena idea? Revisemos la lista de desventajas. ¿Portabilidad? No importa, ya que estos eventos de codificación utilizan una versión específica del compilador que los concursantes conocen de antemano. ¿Cumplimiento de estándares? No es relevante para un bloque de código cuya vida útil sea inferior a una hora. ¿Tiempo de compilación y tamaño ejecutable? Estos no forman parte de la rúbrica de puntuación del concurso.

Entonces nos quedamos con malos hábitos. Ésta es una objeción válida. Al usar este archivo de encabezado, los concursantes evitan la oportunidad de aprender qué archivo de encabezado estándar define la funcionalidad que están usando en su programa. Cuando escriben código del mundo real (y no lo usan stdc++.h), tendrán que dedicar tiempo a buscar esta información, lo que significa que serán menos productivos. Esa es la desventaja de practicar con stdc++.h.

Esto plantea la pregunta de por qué vale la pena participar en programación competitiva si fomenta malos hábitos como usar stdc++.hy violar otros estándares de codificación. Una respuesta es que la gente lo hace por la misma razón por la que publican programas en PP&CG: algunos programadores encuentran divertido usar sus habilidades de codificación en un contexto similar al de un juego.

Entonces, la cuestión de si se debe usar stdc++.hse reduce a si los beneficios de la velocidad de codificación en un concurso de programación superan los malos hábitos que uno podría desarrollar al usarla.

Esta pregunta pregunta: "¿Por qué no debería #incluir <bits/stdc++.h>?" Me doy cuenta de que se preguntó y respondió para hacer un punto, y la respuesta aceptada pretende ser la única respuesta verdadera a esta pregunta. Pero la pregunta no es "¿Por qué no debería #incluir <bits/stdc++.h>en el código de producción?" Por lo tanto, creo que es razonable considerar otros escenarios donde la respuesta puede ser diferente.

12
Bulletmagnet 2019-11-04 01:39.

De N4606, Borrador de trabajo, Estándar para lenguaje de programación C ++:

17.6.1.2 Encabezados [encabezados]

  1. Cada elemento de la biblioteca estándar de C ++ se declara o define (según corresponda) en un encabezado.

  2. La biblioteca estándar C ++ proporciona 61 encabezados de biblioteca C ++, como se muestra en la Tabla 14.

Tabla 14 - Encabezados de la biblioteca de C ++

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

No hay <bits / stdc ++. H> allí. Esto no es sorprendente, ya que los encabezados <bits / ...> son detalles de implementación y generalmente llevan una advertencia:

*  This is an internal header file, included by other library headers.
*  Do not attempt to use it directly. 

<bits / stdc ++. h> también lleva una advertencia:

*  This is an implementation file for a precompiled header.
2
Yunfei Chen 2020-07-08 14:20.

La razón por la que no usamos:

#include <bits/stdc++.h>

se debe a la eficiencia. Permítanme hacer una analogía: Para aquellos de ustedes que conocen Java: Si le preguntaran a su instructor si lo siguiente era una buena idea, a menos que sea un mal instructor, dirían que no:

import java.*.*

La cosa #include ... hace lo mismo básicamente ... Esa no es la única razón para no usarlo, pero es una de las principales razones para no usarlo. Para una analogía de la vida real: imagina que tienes una biblioteca y quieres pedir prestados un par de libros de la biblioteca, ¿reubicarías toda la biblioteca al lado de tu casa? Sería caro e ineficaz. Si solo necesitas 5 libros, entonces solo saca 5 ... No toda la biblioteca .....

#include <bits/stdc++.h>

Parece conveniente al aspecto del programa. Solo necesito escribir una declaración de inclusión y funciona, lo mismo que con mover una biblioteca completa, mira, solo necesito mover una biblioteca completa en lugar de 5 libros, uno por uno. ¿Le parece conveniente, es decir, para la persona que realmente tiene que hacer la mudanza? No tanto, y adivinen qué en C ++ la persona que hará la mudanza será su computadora ... La computadora no disfrutará moviendo toda la biblioteca por cada archivo fuente que escriba:) .....

MORE COOL STUFF

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que tiene 'envenenamiento por mercurio y plomo' probablemente por voltear 'casas asquerosas'

La estrella de HGTV, Christina Hall, revela que le diagnosticaron envenenamiento por mercurio y plomo, probablemente debido a su trabajo como manipuladora de casas.

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

La estrella de 'Love Is Blind' Brennon Lemieux responde a los cargos de violencia doméstica

Recientemente salió a la luz un informe policial que acusa a la estrella de 'Love Is Blind', Brennon, de violencia doméstica. Ahora, Brennon ha respondido a los reclamos.

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia Judd en un momento festivo de pánico

Conozca cómo Wynonna Judd se dio cuenta de que ahora es la matriarca de la familia mientras organizaba la primera celebración de Acción de Gracias desde que murió su madre, Naomi Judd.

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Experto en lenguaje corporal explica los 'paralelos' entre Kate Middleton y la princesa Diana

Descubra por qué un destacado experto en lenguaje corporal cree que es fácil trazar "tales paralelismos" entre la princesa Kate Middleton y la princesa Diana.

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los láseres arrojan luz sobre por qué necesita cerrar la tapa antes de descargar

Los inodoros arrojan columnas de aerosol invisibles con cada descarga. ¿Como sabemos? La prueba fue capturada por láseres de alta potencia.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

¿Caduca el repelente de insectos?

¿Caduca el repelente de insectos?

¿Sigue siendo efectivo ese lote de repelente de insectos que te quedó del verano pasado? Si es así, ¿por cuánto tiempo?

Mire a este policía escalar una situación sin otra razón que ser un idiota

Mire a este policía escalar una situación sin otra razón que ser un idiota

Captura de pantalla del video de Facebook Para aquellos de ustedes que pueden ser demasiado jóvenes para saber esto, antes de que Ice-T fuera una gran estrella en Ley y orden: Unidad de víctimas especiales, era uno de los mejores raperos gangsta de Los Ángeles de todos los tiempos. De hecho, estaba haciendo gangsta rap antes que N.

Reemplace 'Cargado racialmente' por 'Racista' con esta extensión de Chrome

Reemplace 'Cargado racialmente' por 'Racista' con esta extensión de Chrome

Imagen a través de WHAS 11 Algunas cosas realmente podrían tener "carga racial" sin ser racistas. Pero en los principales medios de comunicación, el primero suele ser un código para el segundo.

Proud Mary de Taraji P. Henson es una gran protagonista en busca de una buena película

Proud Mary de Taraji P. Henson es una gran protagonista en busca de una buena película

Foto: Sony Taraji P. Henson, experta tanto en reacciones cáusticas como en expresiones con los ojos húmedos de abrumador conflicto interno, es una actriz dinámica.

Gregg Popovich: LaMarcus Aldridge pidió ser intercambiado este verano, pero ahora estamos bien

Gregg Popovich: LaMarcus Aldridge pidió ser intercambiado este verano, pero ahora estamos bien

Foto: Ronald Martinez / Getty El grandote de los Spurs, LaMarcus Aldridge está teniendo quizás la temporada más eficiente de su carrera mientras reemplaza a Kawhi Leonard como el jugador principal de San Antonio. Mientras que los Warriors y los Rockets están en una carrera armamentista para ver quién puede disparar 100 triples en un juego primero, los Spurs están escondidos detrás de Houston.

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

Patinaje artístico de EE. UU. 'frustrado' por falta de decisión final en evento por equipos, pide una decisión justa

El equipo está a la espera de las medallas que ganó en los Juegos Olímpicos de Invierno de 2022 en Beijing, ya que se está resolviendo un caso de dopaje que involucra a la patinadora artística rusa Kamila Valieva.

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Los compradores de Amazon dicen que duermen 'como un bebé mimado' gracias a estas fundas de almohada de seda que cuestan tan solo $ 10

Miles de compradores de Amazon recomiendan la funda de almohada de seda Mulberry, y está a la venta en este momento. La funda de almohada de seda viene en varios colores y ayuda a mantener el cabello suave y la piel clara. Compre las fundas de almohada de seda mientras tienen hasta un 46 por ciento de descuento en Amazon

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

Se busca al corredor de los Bengals Joe Mixon por orden de arresto emitida por presuntamente apuntar con un arma de fuego a una mujer

El jueves se presentó una denuncia de delito menor amenazante agravado contra Joe Mixon.

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

Profesor de la Universidad de Purdue arrestado por presuntamente traficar metanfetamina y proponer favores sexuales a mujeres

El Departamento de Policía de Lafayette comenzó a investigar a un profesor de la Universidad de Purdue en diciembre después de recibir varias denuncias de un "hombre sospechoso que se acercaba a una mujer".

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Concept Drift: el mundo está cambiando demasiado rápido para la IA

Al igual que el mundo que nos rodea, el lenguaje siempre está cambiando. Mientras que en eras anteriores los cambios en el idioma ocurrían durante años o incluso décadas, ahora pueden ocurrir en cuestión de días o incluso horas.

India me está pateando el culo

India me está pateando el culo

Estoy de vuelta por primera vez en seis años. No puedo decirte cuánto tiempo he estado esperando esto.

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

¿Merrick Garland le ha fallado a Estados Unidos?

Es más de la mitad de la presidencia de Biden. ¿Qué está esperando Merrick Garland?

¿Merrick Garland le ha fallado a Estados Unidos?

Creo, un poco tarde en la vida, en dar oportunidades a la gente. Generosamente.

Language