2

在 Haskell 中有一个常量调用undefined,你可以使用它来声明一个函数而不定义它(即一个空主体的函数原型),就像square

square :: Int -> Int   -- declaration
square = undefined     -- empty definition

main = putStrLn.show.square $ 3

这对于推迟工作square并首先专注于main正确处理函数非常有用,因为 Haskell 编译器确保整个文件像square已定义一样编译。

C++ 等价物是

#import <iostream>
int square(int x){
  //TODO incomplete
  return 0;
}

int main() {
  std::cout << square(3);
}

我的意图是单独调用一个编译器clang++作为类型检查器,然后再继续工作。想象一下,这确实是许多尚未定义的复杂函数之一,它们返回具有非平凡构造函数的复杂数据结构。我必须编写大量代码来创建可返回对象,以便编译函数。mainsquaresquare

C++ 中是否有类似的快速而肮脏的东西undefined

4

3 回答 3

0

谢谢@molbdnilo。使用throw简洁且完美:

int square(int x) {
  throw("undefined");
}
于 2017-11-21T23:02:17.800 回答
0

您还可以使用断言,如下所示:

int square(int x) 
{
  assert(0);
}

这样做的好处是它不能被捕获并且总是会失败。如果您忘记实现该功能,这将更好地保护您。

于 2017-11-22T15:17:38.440 回答
0

C++ 有纯virtual函数,用于抽象基类。

class foo {
  virtual void bar() = 0;
};

该函数foo::bar()不能被调用,实际上foo甚至不能创建一个对象,但它可以在foo. 但是,您可以为其定义派生类默认继承的定义。

C++ 中的另一件事有点类似于undefined未初始化的函数指针。更安全、更现代的解决方案可能是static中止程序的 lambda 表达式或存根函数。

在实际使用中的含义undefined类似于:一个占位符,如果您尝试实际调用它会导致程序崩溃,但它会正确编译并进行类型检查。对于单个目标文件,声明一个extern未在任何地方定义的函数的原型就可以完成这项工作。如果您要链接整个程序,则必须有某种定义(尽管函数指针可以绕过它,但以安全为代价),但它可以是存根。

于 2017-11-22T15:49:30.087 回答