Скажем, у меня есть ниже (очень простой) код.
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Это прекрасно компилируется как на g ++, так и на clang; однако он не может быть скомпилирован в MSVC со следующей ошибкой:
ошибка C2039: «Stoi»: не является членом «STD»
ошибка C3861: «стои»: идентификатор не найден
Я знаю, что std::stoiэто часть <string>заголовка, который предположительно два бывших компилятора включают как часть, <iostream>а последний нет. Согласно стандарту C ++ [res.on.headers]
Заголовок C ++ может включать в себя другие заголовки C ++.
Что для меня в основном говорит о том, что все три компилятора верны.
Эта проблема возникла, когда один из моих студентов представил работу, которую ТА пометил как не компилируемую; Я конечно пошел и починил это. Однако я бы хотел предотвратить подобные инциденты в будущем. Итак, есть ли способ определить, какие файлы заголовков следует включить, если не учитывать компиляцию на трех разных компиляторах, которые нужно проверять каждый раз?
Единственный способ, который я могу придумать, - убедиться, что для каждого stdвызова функции существует соответствующее включение; но если у вас есть код длиной в тысячи строк, поиск по нему может быть утомительным. Есть ли более простой / лучший способ обеспечить совместимость с кросс-компилятором?
Пример с тремя компиляторами: https://godbolt.org/z/kJhS6U
std::stoiэто для обработки строк, вы можете догадаться, что<string>это будет хороший заголовок для включения. Или вы можете найти хорошую ссылку, которая скажет вам. И я рекомендую всегда явно включать файлы заголовков, чтобы вам не приходилось полагаться на поведение, не зависящее от переносимой реализации.