Tôi mới bắt đầu dạy C++, đến từ một số ngôn ngữ khác. Tôi muốn có một số cách để kiểm tra liên tục API được tạo bởi một tệp (học sinh).Sanity of Headers
Giả sử một sinh viên nộp hồ sơ này:
// this is stu.cpp
#include <iostream>
using namespace std;
double x(int y) {return y+0.5;}
Trên thực tế, giả sử tôi hỏi học sinh để xác định một số chức năng khác int x (int). Tôi muốn để có thể kiểm tra điều này bằng cách chạy mã này:
// this is stu.h
int x(int);
// this is gra.cpp
#include "stu.h"
#include <iostream>
using namespace std;
int main() {
cout << x(0); // test their code
}
Vì vậy, tôi đang cố gắng để xem nếu thực hiện của học sinh phù hợp với giao diện yêu cầu, và thử nghiệm nó trên đầu vào 0. Tôi đã có thể hy vọng điều này sẽ không biên dịch. Nhưng khi tôi làm
g++ -Wall -Wconversion *.cpp -o gra
./gra
Nó biên dịch và chạy mà không bị rơi, cho đầu ra 0. Điều này vẫn đúng ngay cả khi tôi biên dịch hai tệp một cách riêng biệt và liên kết chúng sau.
Tôi biết rằng nm
không liệt kê các loại trả lại. Có phải đó là lý do tương tự mà chúng tôi có thể liên kết với nhau hai tệp khi giá trị trả lại không khớp không? Có cách nào lành mạnh để kiểm tra điều này không? (Giống như có các xác nhận kiểu thời gian biên dịch không?)
Hoặc đây có phải là lỗi cụ thể do int và double có thể chuyển đổi được không? Có các tùy chọn trình biên dịch bổ sung có thể bắt được điều này không?
Bạn sẽ gặp lỗi nếu 'stu.cpp' bao gồm' stu.h'. –
Yup, bạn nên biên dịch với '-Wall -Werror -Wextra' và cung cấp cho sinh viên tệp tiêu đề để triển khai (sẽ liên quan đến' # include'-ing nó). –
Bạn có thể thử với 'g ++ -flto -Wall -Wconversion * .cpp -o gra' –