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::stoijest 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 stdwywoł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::stoinatychmiast upewniasz się, że również #include <string>jest obecny.
std::stoijest 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ą.