สมมติว่าฉันมีรหัสด้านล่าง (ง่ายมาก)
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
สิ่งนี้รวบรวมได้ดีทั้ง g ++ และ clang; อย่างไรก็ตามมันไม่สามารถคอมไพล์บน MSVC ด้วยข้อผิดพลาดต่อไปนี้:
ข้อผิดพลาด C2039: 'stoi': ไม่ใช่สมาชิกของ 'std'
ข้อผิดพลาด C3861: 'stoi': ไม่พบตัวระบุ
ฉันรู้ว่าstd::stoiมันเป็นส่วนหนึ่งของ<string>ส่วนหัวซึ่งน่าจะเป็นสิ่งที่คอมไพเลอร์อดีตสองคนรวมอยู่ในส่วนของ<iostream>และส่วนหลังไม่ได้ ตามมาตรฐาน C ++ [res.on.headers]
ส่วนหัว C ++ อาจรวมส่วนหัว C ++ อื่น ๆ
ซึ่งสำหรับฉันแล้วโดยทั่วไปบอกว่าคอมไพเลอร์ทั้งสามนั้นถูกต้อง
ปัญหานี้เกิดขึ้นเมื่อนักเรียนคนหนึ่งของฉันส่งงานซึ่ง TA ทำเครื่องหมายว่าไม่รวบรวม ฉันไปแล้วแน่นอน อย่างไรก็ตามฉันต้องการป้องกันเหตุการณ์ในอนาคตเช่นนี้ ดังนั้นมีวิธีการตรวจสอบไฟล์ส่วนหัวที่ควรจะรวมถึงการรวบรวมในสามคอมไพเลอร์ที่แตกต่างกันเพื่อตรวจสอบทุกครั้งหรือไม่
วิธีเดียวที่ฉันคิดได้ก็คือเพื่อให้แน่ใจว่าสำหรับstdการเรียกใช้ฟังก์ชันทุกครั้งจะมีการรวมที่เหมาะสม แต่ถ้าคุณมีรหัสที่มีอยู่ซึ่งมีความยาวหลายพันบรรทัดการค้นหาอาจน่าเบื่อ มีวิธีที่ง่ายกว่า / ดีกว่าในการตรวจสอบความเข้ากันได้ระหว่างคอมไพเลอร์หรือไม่?
ตัวอย่างกับคอมไพเลอร์สามตัว: https://godbolt.org/z/kJhS6U
std::stoiคุณจะต้องแน่ใจว่า#include <string>มีอยู่ทันที
std::stoiสำหรับการจัดการสตริงคุณสามารถเดาได้ว่า<string>จะเป็นส่วนหัวที่ดีในการ หรือคุณสามารถค้นหาการอ้างอิงที่ดีซึ่งจะบอกคุณ และฉันขอแนะนำให้คุณรวมไฟล์ส่วนหัวไว้อย่างชัดเจนเสมอดังนั้นคุณไม่จำเป็นต้องพึ่งพาพฤติกรรมการใช้งานที่ไม่พกพาได้