我刚刚开始教其他语言的C++.我希望有一些方法可以一致地检查由(学生)文件创建的API.
假设学生提交此文件:
// this is stu.cpp
#include <iostream>
using namespace std;
double x(int y) {return y+0.5;}
Run Code Online (Sandbox Code Playgroud)
实际上,假设我让学生定义了一些其他函数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
}
Run Code Online (Sandbox Code Playgroud)
所以我试图看看学生的实现是否与所需的接口匹配,并在输入0上测试它.我希望这不会编译.但是,当我这样做
g++ -Wall -Wconversion *.cpp -o gra
./gra
Run Code Online (Sandbox Code Playgroud)
它编译并运行而不会崩溃,给出输出0.即使我单独编译这两个文件并在之后链接它们,这仍然是正确的.
我知道nm不列出返回类型.这与返回值不匹配时我们可以将两个文件链接在一起的原因相同吗?有没有理智的方法来测试这个?(就像有编译时类型的断言吗?)
或者这是一个特定的错误,因为int和double是可互换的?是否有额外的编译器选项可以捕获这个?
我在更新调试器以使用Java 8时遇到一些问题.例如,请考虑以下程序:
public class Lam {
public static void main(String[] args) {
java.util.function.Function<Integer, Integer> square =
x -> {
int result = 0;
for (int i=0;
i<x;
i++)
result++;
return result;
};
System.out.println(square.apply(5));
}
}
Run Code Online (Sandbox Code Playgroud)
正如所料,Java 8将lambda编译为如下所示:
> javap -c -p -v -s -constants Lam
Classfile Lam.class
...
private static java.lang.Integer lambda$main$0(java.lang.Integer);
...
Code:
stack=2, locals=3, args_size=1
0: iconst_0
1: istore_1
...
LineNumberTable:
line 5: 0
line 6: 2
line 7: 4
line 9: 12
line 8: 15
line 10: …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于go语言的推迟陈述.它允许您指定函数结束时要执行的操作.例如,如果您有文件指针或资源,而不是使用每个可能的返回路径写入free/delete,则只需指定defer函数一次.
它看起来像一个模拟可能最终来到C++(什么是C++标准延迟/终结执行?,会不会有范围后卫/范围退出成语的标准化?)之前,有什么意外讲的是一个对象,它这样做析构函数进行回调?它看起来像局部变量的析构函数顺序是理智的,它也可以很好地处理异常,但可能不会退出信号.
这是一个示例实现......有什么令人不安的吗?
#include <iostream>
#include <functional>
using namespace std;
class FrameExitTask {
std::function<void()> func_;
public:
FrameExitTask(std::function<void()> func) :
func_(func) {
}
~FrameExitTask() {
func_();
}
FrameExitTask& operator=(const FrameExitTask&) = delete;
FrameExitTask(const FrameExitTask&) = delete;
};
int main() {
FrameExitTask outer_task([](){cout << "world!";});
FrameExitTask inner_task([](){cout << "Hello, ";});
if (1+1 == 2)
return -1;
FrameExitTask skipped_task([](){cout << "Blam";});
}
Run Code Online (Sandbox Code Playgroud)
输出: Hello, world!
我正在调查语言和IDE,用于一个涉及高中学生教学的项目(11年级左右).它将教授编程的基础知识作为计算机科学的介绍(例如,包括如何表示数字/字符串/字符,使用过程和数组,控制流程,一些算法,只有非常基本的I/O).该项目的不可妥协要求是:
到目前为止,我看到的最佳选择如下.还有其他我应该知道的吗?我正在给每个人做一个简短的解释,以便总体展示我在寻找什么.从大多数到最不乐观的顺序:
有希望:
没有希望:
优选地,根据经验,语言应该足够直接,您不需要将每个程序包装在一个类中,也不需要将System对象引用到println等.
我尝试了一下,看看JavaScript中是否存在某些东西或者(非Visual)Basic,但是到目前为止还没有找到.我会说C/C++/C#,Java,Ruby,VB不符合我对这个项目的语言标准.
重申一下我的问题:这些选项中的任何一个都非常棒或者非常棒吗?还有其他选择甚至更棒吗?什么基本或JavaScript符合所有标准?谢谢!
编辑:人们说他们是否推荐他们实际使用的工具是有帮助的; 另外,我根据第一轮回复编辑了上面的列表.
是否可以向g ++添加其他警告标志,以便它在下面的代码中警告我关于单元化的b变量?
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a;
while (a>0) b++;
cout << a;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我忘了提到我已经尝试打开另一个问题中列出的标志: 标志启用彻底和冗长的g ++警告但没有触发.("嘀嗒!",如下所述.)