Neden #inc <<bits / stdc ++. H> yazmamalıyım?


267

Ben sadece #includedirektifi aşağıdaki olan benim kod ile bir soru yayınladı :

#include <bits/stdc++.h>

Öğretmenim bunu yapmamı söyledi, ama yorumlar bölümünde yapmamam gerektiği konusunda bilgilendirildim.

Neden?


72
Huh. using namespace std;Orada bir yerde bir dahil versiyonu olacağını bilmeliydim .
user4581301

1
bu başlık neden var? şüphesiz standart hiçbiri bunu içerir, çünkü çok fazla önemsiz getirecektir? ve herhangi bir kamu tarafından dahil edilmezse ... o zaman neden dağıtımda sevk edilir?
Chris Beck

10
@ChrisBeck: Bu bir uygulama detayı. "Herkese açık API" nın bir parçası değildir veya kullanım içindir. Ancak yine de gönderilmesi gerekiyor, aksi takdirde hiçbir şey işe yaramaz. Standart içerikler ayrı ayrı kullanılamayabilir, ancak önceden derlenmiş başlıklarda kullanım için vardır. En üstteki şu açıklamaya bakın: "Bu, önceden derlenmiş bir başlık için bir uygulama dosyasıdır." .
Orbit'te Hafiflik Yarışları

1
@LightnessRacesinOrbit Bunu kendiniz kullanmanız gerekmiyorsa, varlığı PCH ile nasıl yardımcı olur? Veya gcc, bazı durumlarda PCH amaçları için otomatik olarak geçiş yapacak kadar akıllı mıdır?
Daniel H

2
@LightnessRacesinOrbit "Bu," genel API "nın bir parçası değil veya kullanım amaçlı." Tamamen yanlış, önceden derlenmiş bir başlık olarak genel kullanıma yöneliktir. Libstdc ++ (pre), bu başlığın önceden derlenmiş bir sürümünü derler ve yükler, böylece eklerseniz G ++ bits/stdc++.h.gchbunun yerine önceden derlenmiş sürümü içerir. Var olduğu için var olması gerekir, böylece önceden derlenmiş versiyonu üretilebilir.
Jonathan Wakely

Yanıtlar:


310

Dahil etme <bits/stdc++.h>Yığın Taşması'nda görülmesi gittikçe yaygınlaşan bir şey gibi görünüyor, belki de mevcut akademik yılda ulusal bir müfredata yeni eklenen bir şey.

Avantajların belirsiz bir şekilde verildiğini hayal ediyorum:

  • Sadece bir #includesatır yazmanız gerekiyor
  • Her şeyin hangi standart başlıkta olduğuna bakmanıza gerek yok

Ne yazık ki, bu <string>, <iostream>ve gibi bağımsız standart başlıklar yerine doğrudan bir GCC iç başlığını adlandıran tembel bir hack'tir <vector>. Taşınabilirliği bozar ve korkunç alışkanlıkları teşvik eder.

Dezavantajları şunları içerir:

  • Muhtemelen sadece bu derleyici üzerinde çalışacaktır
  • Kullanırken ne yapacağına dair hiçbir fikriniz yok, çünkü içeriği bir standart tarafından ayarlanmadı
  • Derleyicinizi bir sonraki sürümüne yükseltmek bile programınızı bozabilir
  • Her bir standart başlık, kaynak kodunuzla birlikte ayrıştırılmalı ve derlenmelidir; bu, yavaştır ve belirli derleme ayarları altında büyük bir yürütülebilir dosya ile sonuçlanır.

Yapma!


Daha fazla bilgi:

Quora'nın neden kötü olduğuna örnek:


77
"Belki de mevcut öğretim yılında ulusal bir müfredata yeni bir şey eklendi" Kör kör lider :(
Monica

14
@KubaOber: Kesinlikle.
Yörüngedeki Hafiflik Yarışları

31
Buraya başka bir soruda bir solucan deliğinden geldi, çok iyi. Bu öğretme alışkanlığını daha da kötüleştiren, genellikle onu doğrudan takip eder using namesapce std;. Sadece iki satır ve hemen hemen her güzel tanımlayıcı kullanılır. Öğretildiğini görmek inanılmaz derecede sinir bozucu.
StoryTeller - Unlander Monica

6
Quora örneği hakkında, zamanla değişmiş olabilir. Bugün sayfayı ziyaret ettim ve çevrimiçi programlama yarışmalarının belirli bağlamında listelenen <bits / stdc ++. H> artıları ve eksileri. Sonucu ok-ish buluyorum.
YSC

3
@EvgeniSergeev: 2KiB, etkisini belirlemeye çalışırken çok sayıda kod, veri, sembol bilgisi vb. Eklenen her şeyi anlıyor musunuz? Derleyiciniz için mi? Mevcut sürüm mü? Arasındaki tüm sürümler? Gelecekteki tüm sürümler? Kolaylık ve doğruluk arasında karar vermeniz gerekiyorsa, yalnızca tek bir geçerli seçenek vardır.
Ağustos'ta

47

Neden? Çünkü bir C ++ standart başlığı olması gerekiyormuş gibi kullanılır, ancak standarttan bahsedilmez. Bu nedenle kodunuz inşaat yoluyla taşınabilir değildir. Cppreference ile ilgili herhangi bir belge bulamazsınız . Yani olmayabilir de. Bu birinin hayal ürünüdür :)

Korku ve inançsızlığım için, her C ++ örneğinin bu başlığı içerdiği iyi bilinen bir öğretici site olduğunu keşfettim . Dünya delirmiş. Kanıt bu.


Böyle "öğreticiler" yazan herkese

Lütfen bu üstbilgiyi kullanmayı bırakın. Unut gitsin. Bu deliliği yayma. Bunu yapmanın neden yanlış olduğunu anlamak istemiyorsanız , sözümü alın. Ben hiçbir şey üzerinde bir otorite figürü olarak muamele görmüyorum ve muhtemelen onunla yarın doluyum, ama sadece bu durumda bir istisna yapacağım. Burada neden bahsettiğimi bildiğimi iddia ediyorum. Beni sözüme götür. Size yalvarıyorum.

PS Bu kötü fikrin meydana geldiği iğrenç "öğretim standardını" ve buna yol açan koşulları iyi hayal edebiliyorum. Çünkü pratik bir ihtiyaç var gibi göründüğü için onu kabul edilebilir yapmaz - geçmişe bakıldığında bile.

PPS Hayır, uygulamaya gerek yoktu. Pek çok C ++ standart başlığı yok ve bunlar iyi belgelenmiş. Öğretirseniz, böyle bir "sihir" ekleyerek öğrencilerinize bir kötülük yaparsınız. Büyülü bir zihniyete sahip programcılar üretmek istediğimiz son şey. Öğrencilere hayatlarını kolaylaştırmak için bir C ++ alt kümesi sunmanız gerekiyorsa, öğrettiğiniz ders için geçerli olan kısa başlık listesi ve öğrencilerin kullanmasını beklediğiniz kütüphane yapıları için kısa belgeler içeren bir çalışma kağıdı hazırlayın.


35

Programming Puzzles & Code Golf adlı bir Stack Exchange sitesi var . Bu sitedeki programlama bulmacaları bulmacanın şu tanımına uygundur :

yaratıcılık ya da hasta çabasıyla çözülmesi gereken güçlükler sunarak eğlendirmek için tasarlanmış bir oyuncak, problem ya da başka bir çelişki.

Çalışan bir programcının günlük işlerinde karşılaşılan gerçek dünya sorunuyla eğlendirilebileceği şekilde eğlendirmek için tasarlanmıştır.

Code Golf "katılımcıların belirli bir algoritmayı uygulayan mümkün olan en kısa kaynak kodunu elde etmeye çalıştıkları bir tür eğlence bilgisayarı programlama yarışmasıdır." PP&CG sitesindeki cevaplarda, insanların cevaplarında bayt sayısını belirlediğini göreceksiniz. Birkaç bayt tıraş etmenin bir yolunu bulduğunda, orijinal numarayı çıkarır ve yenisini kaydeder.

Tahmin edebileceğiniz gibi, kod golfü aşırı programlama dili kötüye kullanımını ödüllendirir. Tek harfli değişken adları. Boşluk yok. Kütüphane fonksiyonlarının yaratıcı kullanımı. Belgelenmemiş özellikler. Standart dışı programlama uygulamaları. Korkunç hackler.

Bir programcı golf tarzı kod içeren bir çekme isteği gönderirse reddedilir. İş arkadaşları onlara gülerdi. Yöneticileri sohbet için masasına bırakacaktı. Yine de, programcılar PP&CG'ye cevap göndererek kendilerini eğlendiriyorlar.

Bunun ne ile ilgisi var stdc++.h? Diğerlerinin de belirttiği gibi, onu kullanmak tembeldir. Taşınabilir değildir, bu nedenle derleyicinizde mi yoksa derleyicinizin bir sonraki sürümünde mi çalışacağını bilmezsiniz. Kötü alışkanlıkları teşvik eder. Standart değildir, bu nedenle programınızın davranışı beklediğinizden farklı olabilir. Derleme süresini ve yürütülebilir boyutu artırabilir.

Bunların hepsi geçerli ve doğru itirazlardır. Öyleyse neden kimse bu canavarlığı kullansın ki?

Bazı insanlar golf kodu olmadan bulmaca programlama gibi görünüyor . ACM-ICPC, Google Code Jam ve Facebook Hacker Cup gibi etkinliklerde veya Topcoder ve Codeforces gibi sitelerde bir araya geliyor ve yarışıyorlar. Sıralamaları programın doğruluğuna, yürütme hızına ve ne kadar hızlı bir çözüm sunduklarına dayanır. Yürütme hızını en üst düzeye çıkarmak için birçok katılımcı C ++ kullanır. Kodlama hızını en üst düzeye çıkarmak için bazıları kullanır .stdc++.h

Bu iyi bir fikir mi? Dezavantajların listesini kontrol edelim. Taşınabilirlik? Bu kodlama olayları yarışmacıların önceden bildiği belirli bir derleyici sürümünü kullandığından önemli değildir. Standartlara Uygunluk? Kullanım ömrü bir saatten az olan bir kod bloğu için geçerli değildir. Zaman ve çalıştırılabilir boyut derlensin mi? Bunlar yarışmanın puanlama tablosunun bir parçası değildir.

Yani kötü alışkanlıklarımız kaldı. Bu geçerli bir itiraz. Bu başlık dosyasını kullanarak, yarışmacılar hangi standart başlık dosyasının programlarında kullandıkları işlevselliği tanımladığını öğrenme şansından kaçınırlar. Gerçek dünya kodu yazarken (ve kullanmıyorken stdc++.h) bu bilgileri aramak için zaman harcamak zorunda kalacaklar, yani daha az üretken olacaklar. Bu pratik yapmanın dezavantajı stdc++.h.

Bu, stdc++.hdiğer kodlama standartlarını kullanmak ve ihlal etmek gibi kötü alışkanlıkları teşvik ederse, neden rekabetçi programlamaya katılmaya değer olduğu sorusunu gündeme getirir . Bir cevap, insanların bunu PP&CG'de program yayınlamakla aynı nedenden ötürü yapmalarıdır: Bazı programcılar kodlama becerilerini oyun benzeri bir bağlamda kullanmanın keyifli olduğunu düşünürler.

Dolayısıyla, kullanılıp kullanılmayacağı sorusu, stdc++.hbir programlama yarışmasında kodlama hızının faydalarının, onu kullanarak geliştirebileceği kötü alışkanlıklardan daha ağır basmasıyla ilgilidir.

Bu soru soruyor: "Neden #inc içermemeliyim <bits/stdc++.h>?" Bir noktaya değinmenin istendiğini ve cevaplandığını ve kabul edilen cevabın bu sorunun Tek Doğru Cevabı olması gerektiğini anlıyorum. Ancak soru " <bits/stdc++.h>Üretim koduna neden dahil olmamalıyım ?" Bu nedenle, cevabın farklı olabileceği diğer senaryoları düşünmenin makul olduğunu düşünüyorum.


5
Zaten iptal ettim, ancak "eğlence için" nin rekabetçi programlamaya katılmak için iyi bir neden olduğunu belirtmeye değer olabilir. Öte yandan "potansiyel bir işverenleri etkilemek" değildir - durumunuz benimle aktif olarak zarar verecektir .
Martin Bonner,

2
@MartinBonner Bazı işe alım yöneticilerinin rekabetçi programlama deneyimini kırmızı bayrak olarak gördüğünü biliyorum. Ancak en iyi yazılım şirketleri mülakatlarında CP tarzı problemler kullandıkları ve yeni işe alımlar bulmak için programlama yarışmaları düzenledikleri sürece CP, istekli geliştiriciler arasında popüler olmaya devam edecektir.
RedGreenCode

@RedGreenCode Yönetici değilim (teşekkür ederim $ DEITY), ancak bazen işe alma tasarımları üzerinde etkim var. Ve kesinlikle "rekabetçi programlamaya" atıfta bulunmanın büyük bir kırmızı bayrak olduğunu görüyorum - bir avantaj değil .
Jesper Juhl

3
@JesperJuhl Şirketinizdeki teknik görüşmeciler görüşmelerinde algoritmik bulmacalar kullanıyorlarsa (çoğunun yaptığı gibi), bu rekabetçi programlama deneyimine sahip adaylara avantaj sağlar. Belki adaylar için akılcı seçim CP'ye katılmak, ancak özgeçmiş / özgeçmişlerinden bahsetmekten kaçınmaktır.
RedGreenCode

2
Bu başlığın bazı rekabetçi programlamalarda kullanılabileceği doğru olsa da, tam olarak nereden geldiği değil. Bir sınıftan geldi. Ve o sınıfta öğreten her kim, yüz binlerce öğrenciyi olmasa bile, ondan sonra gelen çağlayanlar aracılığıyla kirletmek için yeterli etkiye sahipti. Ve şimdi bu öğrenciler öğreticiler için bir yere gitmek için öğreticiler de yazıyorlar. Sadece bir köşede ağlamak istiyorum. Rekabetçi programlama siteleri, standart olmayan herhangi bir üstbilgiyi reddetmek için normal ifadeye sahip olmalıdır .
Monica

8

N4606'dan, Çalışma Taslağı, Programlama Dili C Standardı C ++:

17.6.1.2 Üstbilgiler [üstbilgiler]

  1. C ++ standart kitaplığının her öğesi bir başlıkta bildirilir veya tanımlanır (uygunsa).

  2. C ++ standart kitaplığı, Tablo 14'te gösterildiği gibi 61 C ++ kitaplık başlığı sağlar.

Tablo 14 - C ++ kütüphane başlıkları

<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>

Orada hiçbir <bits / stdc ++. H> yoktur. <Bits / ...> başlıkları uygulama detayı olduğundan ve genellikle bir uyarı taşıdığından bu şaşırtıcı değildir:

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

<bits / stdc ++. h> ayrıca bir uyarı taşır:

*  This is an implementation file for a precompiled header.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.