Powiedz, że mam poniższy (bardzo prosty) kod.
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Kompiluje to dobrze zarówno na g ++, jak i clang; jednak nie można go skompilować na MSVC z następującym błędem:
błąd C2039: „stoi”: nie jest członkiem „std”
błąd C3861: „stoi”: nie znaleziono identyfikatora
Wiem, że std::stoi
jest to część <string>
nagłówka, który prawdopodobnie obejmuje dwa poprzednie kompilatory, <iostream>
a drugi nie. Zgodnie ze standardem C ++ [res.on.headers]
Nagłówek C ++ może zawierać inne nagłówki C ++.
Co dla mnie w zasadzie mówi, że wszystkie trzy kompilatory są poprawne.
Kwestia ta pojawiła się, gdy jeden z moich studentów przesłał prace, które TA oznaczyła jako niekompilujące; Oczywiście poszedłem i to naprawiłem. Chciałbym jednak zapobiec takim incydentom w przyszłości. Czy istnieje sposób na określenie, które pliki nagłówkowe powinny zostać uwzględnione, bez kompilacji na trzech różnych kompilatorach, które należy sprawdzać za każdym razem?
Jedynym sposobem, jaki mogę wymyślić, jest zapewnienie, aby dla każdego std
wywołania funkcji istniało odpowiednie uwzględnienie; ale jeśli masz istniejący kod, który ma tysiące linii, przeszukiwanie go może być uciążliwe. Czy istnieje łatwiejszy / lepszy sposób zapewnienia zgodności między kompilatorami?
Przykład z trzema kompilatorami: https://godbolt.org/z/kJhS6U
std::stoi
natychmiast upewniasz się, że również #include <string>
jest obecny.
std::stoi
jest to do obsługi ciągów, możesz zgadywać, że<string>
byłby to dobry nagłówek do włączenia. Lub możesz wyszukać dobre referencje, które ci powiedzą. I zalecam, aby zawsze jawnie dołączać pliki nagłówkowe, abyś nie musiał polegać na nieprzenośnych specyficznych zachowaniach związanych z implementacją.