Здравомыслие заголовков

Я только начинаю преподавать C ++, исходя из некоторых других языков. Мне бы хотелось, чтобы был какой-то способ последовательно проверять 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 не перечисляет типы возврата. Это та же самая причина, по которой мы можем связать вместе два файла, когда возвращаемые значения не совпадают? Есть ли вменяемый способ проверить это? (Например, есть ли тип утверждений во время компиляции?)

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

12

Решение

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

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, при компиляции файла C ++ учащегося. В качестве примера:

api.h

int x(int);

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

8

Другие решения

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

// 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 конечно.

1

По вопросам рекламы [email protected]