Właśnie zaczynam uczyć C++, pochodzących z innych języków. Żałuję, że nie było sposobu, aby konsekwentnie sprawdzać API stworzone przez plik (studenta).Poczytalność nagłówków
Załóżmy student podnosi tego pliku:
// this is stu.cpp
#include <iostream>
using namespace std;
double x(int y) {return y+0.5;}
Właściwie przypuszczać spytałem studenta zdefiniować jakąś inną funkcję int x (int). Chciałbym móc to sprawdzić uruchamiając ten kod:
// 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
}
Więc staram się zobaczyć, czy wdrożenie studenta dopasowany odpowiedni interfejs i testowania go na wejście 0. Chciałbym mieć nadzieję, nie byłoby skompilować. Ale kiedy zrobić
g++ -Wall -Wconversion *.cpp -o gra
./gra
To kompiluje i działa bez zarzutu, dając wyjście 0. To pozostaje prawdą, nawet jeśli skompilować dwa pliki osobno i połączyć je później.
Wiem, że nm
nie wyświetla typów zwrotu. Czy to jest ten sam powód, dla którego możemy połączyć dwa pliki, gdy wartości zwracane nie są zgodne? Czy istnieje jakiś rozsądny sposób na sprawdzenie tego? (Podobnie jak w przypadku twierdzeń typu kompilacji?)
Czy jest to konkretny błąd z powodu int i double being interconvertible? Czy są dostępne dodatkowe opcje kompilatora, które mogłyby to złapać?
Pojawiłby się błąd, gdyby słowo "stu.cpp" zawierało słowo "stu.h". –
Tak, powinieneś skompilować z '-Wall -Werror -Wextra' i dać uczniom plik nagłówkowy do implementacji (który będzie obejmował' # include'-inging). –
Możesz spróbować z 'g ++ -flto -Wall -Wconversion * .cpp -o gra' –