Làm thế nào để xác định những tập tin tiêu đề để bao gồm?


13

Nói rằng tôi có mã dưới đây (rất đơn giản).

#include <iostream>
int main() {
    std::cout << std::stoi("12");
}

Điều này biên dịch tốt trên cả g ++ và clang; tuy nhiên, nó không thể biên dịch trên MSVC với lỗi sau:

lỗi C2039: 'stoi': không phải là thành viên của 'std'

lỗi C3861: 'stoi': không tìm thấy định danh

Tôi biết đó std::stoilà một phần của <string>tiêu đề, có lẽ hai trình biên dịch trước bao gồm một phần <iostream>và phần sau thì không. Theo tiêu chuẩn C ++ [res.on.headers]

Một tiêu đề C ++ có thể bao gồm các tiêu đề C ++ khác.

Trong đó, với tôi, về cơ bản nói rằng cả ba trình biên dịch đều đúng.

Vấn đề này phát sinh khi một trong những học sinh của tôi nộp bài, mà TA đánh dấu là không biên dịch; Tôi tất nhiên đã đi và sửa nó. Tuy nhiên, tôi muốn ngăn chặn những sự cố trong tương lai như thế này. Vì vậy, có cách nào để xác định tập tin tiêu đề nào nên được đưa vào, không cần biên dịch trên ba trình biên dịch khác nhau để kiểm tra mỗi lần?

Cách duy nhất tôi có thể nghĩ đến là đảm bảo rằng đối với mọi stdlệnh gọi hàm, bao gồm một hàm thích hợp; nhưng nếu bạn có mã hiện có dài hàng nghìn dòng, điều này có thể rất tẻ nhạt để tìm kiếm. Có cách nào dễ dàng / tốt hơn để đảm bảo khả năng tương thích chéo của trình biên dịch không?

Ví dụ với ba trình biên dịch: https://godbolt.org/z/kJhS6U


6
Nếu bạn nhớ đó std::stoilà để xử lý các chuỗi, bạn có thể đoán đó <string>sẽ là một tiêu đề tốt để đưa vào. Hoặc bạn có thể tìm kiếm một tài liệu tham khảo tốt sẽ cho bạn biết. Và tôi khuyên bạn luôn luôn bao gồm các tệp tiêu đề một cách rõ ràng, vì vậy bạn không cần phải dựa vào hành vi cụ thể thực hiện không di động.
Một số lập trình viên anh chàng

3
Cách tốt nhất là đi đến cppreference trước khi đi đến bất kỳ nền tảng nào khác. Họ có những thứ khá chi tiết ở đó.
Siddharth

1
Bao gồm tiêu đề thích hợp thời điểm bạn viết mã. I E. thời điểm bạn viết mã có chứa, std::stoingay lập tức bạn chắc chắn #include <string>cũng có mặt.
Sander De Dycker

3
Trong trường hợp chung đây là một vấn đề khó khăn . Tuy nhiên, khi chúng ta đang nói về việc thiếu thư viện tiêu chuẩn, cách thông thường thực sự sẽ là kiểm tra tất cả các cuộc gọi / loại chức năng được sử dụng.
Max Langhof

1
@ skratchi.at, sinh viên được cho biết họ có thể sử dụng bất kỳ trình biên dịch nào họ muốn, miễn là mã của họ tuân thủ tiêu chuẩn. Sau 4 năm, đây là lần đầu tiên đây là một vấn đề.
ChrisMM

Câu trả lời:


14

Có cách nào dễ dàng / tốt hơn để đảm bảo khả năng tương thích chéo của trình biên dịch không?

Điều này sẽ luôn là một việc vặt nếu bạn có một cơ sở mã lớn và đã không làm điều này cho đến nay, nhưng một khi bạn đã trải qua việc sửa lỗi bao gồm, bạn có thể thực hiện một quy trình đơn giản:

Khi bạn viết mã mới sử dụng một tính năng tiêu chuẩn, như std::stoi, cắm tên đó vào Google, hãy truy cập bài viết cppreference.com cho nó, sau đó nhìn vào đầu để xem tiêu đề nào được xác định.

Sau đó bao gồm điều đó, nếu nó chưa được bao gồm. Công việc hoàn thành!

(Bạn có thể sử dụng tiêu chuẩn cho việc này, nhưng điều đó không thể truy cập được.)

Đừng cố gắng sa thải tất cả để ủng hộ những vụ hack rẻ tiền, không thể truy cập như <bits/stdc++.h>!


tl; dr: tài liệu


3
Công bằng mà nói, một khi bạn đã ghi nhớ tất cả chúng một cách hiệu quả và không cần phải tìm kiếm nó nữa, điều đó cảm thấy khá khó khăn
Các cuộc đua Lightness trong Orbit

5
@JosephWood: Nếu bạn không biết chức năng đã cho là tiêu đề nào, thì có lẽ bạn nên xem chức năng này để kiểm tra lại các giả định của mình về nó, vì vậy, việc tìm ra tiêu đề nào thuộc về nó thậm chí không cần thêm thời gian.
DevSolar

1
Giống như @JosephWood, tôi cũng hy vọng những người có nhiều kinh nghiệm có cách tốt hơn. Tôi biết tiêu đề nào cần bao gồm cho hầu hết các chức năng STL, nhưng hy vọng có cách dạy học sinh dễ dàng hơn là tìm kiếm mọi chức năng: P
ChrisMM

1
@ChrisMM có các công cụ như bao gồm những gì bạn đang sử dụng . Tính đúng đắn của chúng không thể được đảm bảo (và thực sự đôi khi công việc thủ công là cần thiết) nhưng nó không tệ chút nào.
kỳ dị

4
@ChrisMM Dạy học sinh của bạn tham khảo tài liệu là vô cùng quan trọng . Hàng ngàn người truy cập vào trang web này mỗi ngày mà không có ý tưởng nào về việc họ nên làm điều đó. Sử dụng tài liệu cách dễ dàng hơn / tốt hơn.
Các cuộc đua nhẹ nhàng trong quỹ đạo

-1

Bên cạnh việc xem xét tài liệu và làm điều đó bằng tay (đau đớn và tốn thời gian), bạn có thể sử dụng một số công cụ có thể làm điều đó cho bạn.

Bạn có thể sử dụng ReSharper trong Visual Studio có khả năng tổ chức nhập khẩu (thực tế VS không có ReSharper thì không thể sử dụng được). Nếu bao gồm bị thiếu, nó khuyên bạn nên thêm nó và nếu nó là dòng lỗi thời với bao gồm được hiển thị trong các màu nhạt hơn.

Hoặc bạn có thể sử dụng CLion (có sẵn cho tất cả các nền tảng) cũng có khả năng này (thực tế đây là cùng một JetBrains sản xuất).

Ngoài ra còn có công cụ được gọi là bao gồm những gì bạn đã sử dụng , nhưng mục đích của nó là tận dụng lợi thế của khai báo chuyển tiếp, tôi không bao giờ sử dụng điều đó (cá nhân - đồng đội của tôi đã làm điều đó cho dự án của chúng tôi).


clion không tự động bao gồm tiêu đề chính xác khi tiêu đề khác đã được bao gồm nếu hoạt động (nghĩa là sẽ không đề xuất chuỗi ở đây nếu đã bao gồm iostream) IIRC
Rịa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.