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