Hangi başlık dosyalarının ekleneceğini nasıl belirleyebilirim?


13

Diyelim ki aşağıdaki kod (çok basit).

#include <iostream>
int main() {
    std::cout << std::stoi("12");
}

Bu hem g ++ hem de clang üzerinde iyi derler; ancak MSVC'de aşağıdaki hatayla derlenemez:

hata C2039: 'stoi': 'std' üyesi değil

hata C3861: 'stoi': tanımlayıcı bulunamadı

Bunun iki eski derleyicinin bir parçası olarak içerdiği ve ikincisinin içermediği başlığın bir std::stoiparçası olduğunu biliyorum . C ++ standardına göre [res.on.headers]<string><iostream>

Bir C ++ üstbilgisi diğer C ++ üstbilgilerini içerebilir.

Bana göre, temel olarak her üç derleyicinin de doğru olduğunu söylüyor.

Bu sorun, öğrencilerimden biri Teknik Yardım'ın derlenmediğini belirten bir çalışma sunduğunda ortaya çıktı; Elbette gittim ve düzelttim. Ancak, bunun gibi gelecekteki olayları önlemek istiyorum. Peki, hangi başlık dosyalarının dahil edilmesi gerektiğini belirlemenin bir yolu var mı?

Düşünebilmemin tek yolu, her stdişlev çağrısı için uygun bir dahil olmasını sağlamaktır ; ancak binlerce satır uzunluğunda mevcut bir kodunuz varsa, bu arama yapmak sıkıcı olabilir. Derleyiciler arası uyumluluğu sağlamak için daha kolay / daha iyi bir yol var mı?

Üç derleyiciye örnek: https://godbolt.org/z/kJhS6U


6
Eğer dizeleristd::stoi işlemek için olduğunu hatırlarsanız, bu eklemek için iyi bir başlık olacağını tahmin edebilirsiniz . Veya size söyleyecek iyi bir referans arayabilirsiniz . Üstbilgi dosyalarını her zaman açıkça eklemenizi öneririm, bu nedenle taşınabilir olmayan uygulamaya özel davranışa güvenmeniz gerekmez. <string>
Bazı programcı dostum

3
En iyi yol, başka bir platforma gitmeden önce cppreference'e gitmektir . Orada oldukça ayrıntılı şeyler var.
Siddharth

1
Kodu yazdığınız anda uygun başlığı ekleyin. Yani. içeren kodu yazdığınızda, std::stoihemen #include <string>mevcut olduğundan da emin olursunuz .
Sander De Dycker

3
Genel durumda bu zor bir sorundur . Ancak, eksik standart kitaplık içeriklerinden bahsederken, normal yol kullanılan tüm fonksiyon çağrılarını / tiplerini incelemektir.
Max Langhof

1
@ skratchi.at, öğrencilere, kodları standartlara uygun olduğu sürece istedikleri derleyiciyi kullanabildikleri söylenir. 4 yıl sonra, bu ilk kez bir sorun olmuştur.
ChrisMM

Yanıtlar:


14

Derleyiciler arası uyumluluğu sağlamak için daha kolay / daha iyi bir yol var mı?

Büyük bir kod tabanınız varsa ve şu ana kadar yapmadıysanız, bu her zaman bir angarya olacaktır, ancak içeriğinizi düzelttikten sonra basit bir prosedüre bağlı kalabilirsiniz:

Standart bir özellik kullanan yeni bir kod yazdığınızda, örneğin std::stoi, bu adı Google'a takın, bunun için cppreference.com makalesine gidin, ardından hangi başlıkta tanımlandığını görmek için en üste bakın.

Ardından, zaten dahil edilmemişse ekleyin. İş bitmiş!

(Sen olabilir bu standardını kullanmak, ama bu erişilebilir olarak değil.)

Bunu görevden almak cazip olabilir lehine tüm kapalı ucuza, unportable kesmek gibi <bits/stdc++.h>!


tl; dr: belgeler


3
Adil olmak gerekirse, hepsini etkili bir şekilde ezberledikten ve daha fazla aramaya gerek duymadığınızda, bu oldukça kaygan hissettiriyor
Orbit'teki Lightness Races

5
@JosephWood Sayısı: Belirli bir fonksiyon ezberden hangi başlık bilmiyorsanız, büyük ihtimalle vardır gerektiğini fonksiyonu bakmak kez daha kontrol böylece bile ekstra almaz ait başlık hangi bulma de neredeyse varsayımlarınızı saati.
DevSolar

1
@JosephWood gibi, daha fazla deneyime sahip olanların daha iyi bir yolu olduğunu umuyordum. Çoğu STL işlevi için hangi başlıkların ekleneceğini biliyorum, ancak öğrencilere her işlevi aramaktan daha kolay bir yol olduğunu umuyordum: P
ChrisMM

1
@ChrisMM, ne kullandığınızı dahil etmek gibi araçlar var . Doğruluğu garanti edilemez (ve bazen de manuel çalışma gereklidir) ama hiç de fena değil.
ucube

4
@ChrisMM Öğrencilerinize belgelere başvurmayı öğretmek inanılmaz, inanılmaz derecede önemlidir . Binlerce kişi bu siteye her gün yapmaları gerektiği hakkında hiçbir fikre sahip olmadan akış yapıyor. Belgelerin Kullanımı ise daha kolay / daha iyi bir yol.
Yörüngedeki Hafiflik Yarışları

-1

Belgeleri incelemenin ve manuel olarak yapmanın (acı verici ve zaman alıcı) yanı sıra, bunu sizin için yapabilen bazı araçlar kullanabilirsiniz.

İthalatları düzenleyebilen Visual Studio'da ReSharper'ı kullanabilirsiniz (aslında ReSharper olmadan VS çok kullanışlı değildir). İçerme eksikse, eklemeyi önerir ve dahil olan eski satır daha soluk renklerde gösterilir.

Ya da bu özelliğe sahip CLion'u (tüm platformlar için kullanılabilir) kullanabilirsiniz (aslında bu aynı JetBrains üretimidir).

Kullandığınız şeyi de içeren bir araç da var , ancak amacı ileri bildirimin avantajlarından yararlanmak, bunu hiç kullanmadım (kişisel olarak - takım arkadaşım bunu projemiz için yaptı).


clion, eğer çalışırsa başka bir başlık zaten eklendiğinde otomatik olarak doğru üstbilgiyi içermez (yani, iostream zaten eklenmişse burada dize
önermez
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.