Supponiamo di avere il codice (molto semplice) di seguito.
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Questo si compila bene su g ++ e clang; tuttavia, non riesce a compilare su MSVC con il seguente errore:
errore C2039: 'stoi': non è un membro di 'std'
errore C3861: 'stoi': identificatore non trovato
So che std::stoi
fa parte <string>
dell'intestazione, che presumibilmente i due ex compilatori includono come parte <iostream>
e quest'ultimo no. Secondo lo standard C ++ [res.on.headers]
Un'intestazione C ++ può includere altre intestazioni C ++.
Il che, per me, in pratica dice che tutti e tre i compilatori sono corretti.
Questo problema è emerso quando uno dei miei studenti ha presentato un lavoro, che l'AT ha contrassegnato come non compilante; Ovviamente sono andato a risolverlo. Tuttavia, vorrei prevenire incidenti futuri come questo. Quindi, c'è un modo per determinare quali file di intestazione dovrebbero essere inclusi, a meno di compilare tre diversi compilatori da controllare ogni volta?
L'unico modo a cui riesco a pensare è quello di garantire che per ogni std
chiamata di funzione, esista un'inclusione appropriata; ma se hai un codice esistente che è lungo migliaia di righe, può essere noioso cercarlo. Esiste un modo più semplice / migliore per garantire la compatibilità tra compilatori?
Esempio con i tre compilatori: https://godbolt.org/z/kJhS6U
std::stoi
, ti assicuri immediatamente che #include <string>
sia presente anche.
std::stoi
è per la gestione delle stringhe potresti immaginare che<string>
sarebbe una buona intestazione da includere. Oppure potresti cercare un buon riferimento che ti dirà. E ti consiglio di includere sempre esplicitamente i file di intestazione, quindi non devi fare affidamento su comportamenti specifici dell'implementazione non portatile.