标题的完整性

时间:2014-09-08 20:33:39

标签: c++ linker typechecking

我刚开始教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是可互换的?是否有额外的编译器选项可以捕获这个?

2 个答案:

答案 0 :(得分:8)

不是单独编写学生代码,为什么不直接将其包含在测试人员程序中?

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

然后你应该得到一个很好的错误:

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

虽然这不是&#34;正常&#34;编译学生代码的方法,它保证可以检查代码。


或者,您可以使用编译器命令行选项(如-include(GCC,Clang)来强制编译器在编译学生的C ++文件时包含包含所需API的头文件。举个例子:

<强> api.h

int x(int);

使用g++ stu.cpp -include api.h进行编译,将引发相应的错误。

答案 1 :(得分:1)

您可以执行以下操作:

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