Katakanlah saya memiliki kode di bawah ini (sangat sederhana).
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Ini mengkompilasi dengan baik pada g ++ dan dentang; Namun, gagal dikompilasi di MSVC dengan kesalahan berikut:
kesalahan C2039: 'stoi': bukan anggota 'std'
kesalahan C3861: 'stoi': pengidentifikasi tidak ditemukan
Saya tahu itu std::stoiadalah bagian dari <string>header, yang mungkin dua kompiler sebelumnya termasuk sebagai bagian dari <iostream>dan yang terakhir tidak. Menurut standar C ++ [res.on.headers]
Header C ++ dapat menyertakan header C ++ lainnya.
Yang, bagi saya, pada dasarnya mengatakan bahwa ketiga kompiler itu benar.
Masalah ini muncul ketika salah satu siswa saya menyerahkan pekerjaan, yang TA ditandai sebagai tidak dikompilasi; Saya tentu saja pergi dan memperbaikinya. Namun, saya ingin mencegah insiden di masa depan seperti ini. Jadi, apakah ada cara untuk menentukan file header mana yang harus dimasukkan, singkat mengkompilasi pada tiga kompiler berbeda untuk memeriksa setiap waktu?
Satu-satunya cara yang dapat saya pikirkan adalah untuk memastikan bahwa untuk setiap stdpanggilan fungsi, termasuk yang sesuai ada; tetapi jika Anda memiliki kode yang panjangnya ribuan baris, ini mungkin membosankan untuk dicari. Apakah ada cara yang lebih mudah / lebih baik untuk memastikan kompatibilitas lintas-kompiler?
Contoh dengan tiga kompiler: https://godbolt.org/z/kJhS6U
std::stoi,, Anda segera memastikan #include <string>hadir juga.
std::stoiuntuk menangani string, Anda bisa menebak itu<string>akan menjadi header yang baik untuk dimasukkan. Atau Anda bisa mencari referensi yang bagus yang akan memberi tahu Anda. Dan saya sarankan Anda selalu secara eksplisit memasukkan file header, jadi Anda tidak harus bergantung pada perilaku spesifik implementasi non-portabel.