Подтвердить что ты не робот

Злость заголовков

Я только начинаю преподавать С++, исходя из некоторых других языков. Я хочу, чтобы был некоторый способ последовательно проверять API, созданный (студенческим) файлом.

Предположим, что ученик отправляет этот файл:

// this is stu.cpp
#include <iostream>
using namespace std;
double x(int y) {return y+0.5;}

Собственно, предположим, что я попросил ученика определить некоторую другую функцию int x (int). Я хотел бы проверить это, запустив этот код:

// 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
}

Итак, я пытаюсь понять, соответствует ли реализация студенту требуемому интерфейсу и тестирует его на входе 0. Я бы надеялся, что это не скомпилируется. Но когда я делаю

g++ -Wall -Wconversion *.cpp -o gra
./gra

Он компилируется и запускается без сбоев, выдавая результат 0. Это остается верным, даже если я скомпилирую два файла отдельно и свяжу их после.

Я знаю, что nm не отображает типы возвращаемых данных. По той же причине мы можем связать два файла, когда возвращаемые значения не совпадают? Есть ли разумный способ проверить это? (Например, существуют ли утверждения типа типа compile-time?)

Или это конкретная ошибка из-за того, что int и double являются взаимопревращаемыми? Есть ли дополнительные параметры компилятора, которые могли бы поймать это?

4b9b3361

Ответ 1

Вместо того, чтобы отдельно составлять код студента, почему бы вам просто не включить его непосредственно в программу тестера?

int x(int);
#include <stu.cpp>

Затем вы должны получить приятную ошибку, например:

a.cpp:2:8: error: functions that differ only in their return type cannot be overloaded

Хотя это не "нормальный" способ скомпилировать код ученика, он гарантирует, что код можно проверить.


В качестве альтернативы вы можете использовать параметр командной строки компилятора, например -include (GCC, Clang), чтобы заставить компилятор включать заголовочный файл, содержащий требуемый API, при компиляции студенческого файла С++. В качестве примера:

api.h

int x(int);

скомпилировать с g++ stu.cpp -include api.h, и соответствующая ошибка будет поднята.

Ответ 2

Вы можете сделать следующее:

// this is gra.cpp
#include "stu.h"
#include "stu.cpp"
#include <iostream>
using namespace std;

int main() {
    cout << x(0); // test their code
}

И скомпилируйте только gra.cpp, конечно.