小编dav*_*agp的帖子

标题的完整性

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

c++ linker typechecking

12
推荐指数
1
解决办法
430
查看次数

Java调试接口,Lambda和行号

我在更新调试器以使用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)

java lambda jdi java-8

11
推荐指数
1
解决办法
862
查看次数

在C++中golang风格的"延迟"

我正在阅读关于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!

c++ destructor functional-programming go c++11

10
推荐指数
2
解决办法
7828
查看次数

用于教授高中生的语言+ IDE?

我正在调查语言和IDE,用于一个涉及高中学生教学的项目(11年级左右).它将教授编程的基础知识作为计算机科学的介绍(例如,包括如何表示数字/字符串/字符,使用过程和数组,控制流程,一些算法,只有非常基本的I/O).该项目的不可妥协要求是:

  • 一个免费的最新跨平台IDE(Win和Mac,包括64位),带有调​​试功能
  • 一个编译器,很容易从你的错误中学习
  • 与IDE一起,温和的安装+学习曲线

到目前为止,我看到的最佳选择如下.还有其他我应该知道的吗?我正在给每个人做一个简短的解释,以便总体展示我在寻找什么.从大多数到最不乐观的顺序:

有希望:

  • Pascal + FreePascal IDE(看起来有点小马车但是积极开发?)
  • Python + Eclipse + PyDev(很好,但功能非常庞大/很难导航)
  • Scheme + DrScheme/PLTScheme(好但很不一样)
  • Python + IDLE(看起来不自然地做调试,对我来说)
  • Boo + MonoDevelop

没有希望:

  • Pascal + Lazarus(IDE势不可挡,例如并不明显如何"从头开始")
  • Groovy + Eclipse(调试模式进入Java)

优选地,根据经验,语言应该足够直接,您不需要将每个程序包装在一个类中,也不需要将System对象引用到println等.

我尝试了一下,看看JavaScript中是否存在某些东西或者(非Visual)Basic,但是到目前为止还没有找到.我会说C/C++/C#,Java,Ruby,VB不符合我对这个项目的语言标准.

重申一下我的问题:这些选项中的任何一个都非常棒或者非常棒吗?还有其他选择甚至更棒吗?什么基本或JavaScript符合所有标准?谢谢!

编辑:人们说他们是否推荐他们实际使用的工具是有帮助的; 另外,我根据第一轮回复编辑了上面的列表.

ide programming-languages

3
推荐指数
1
解决办法
1198
查看次数

更好的编译器警告?

是否可以向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 ++警告但没有触发.("嘀嗒!",如下所述.)

c++ g++ compiler-warnings

1
推荐指数
1
解决办法
277
查看次数