如何像 Haskell 中的“undefined”一样在 C++ 中保留未定义的声明函数?

How to leave a declared function undefined in C++ like with `undefined` in Haskell?

在 Haskell 中有一个名为 undefined 的常量,您可以使用它来 像 squarein 一样声明一个函数而不定义它(即函数原型为空体)

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++ 这样的编译器作为 main 的类型检查器,然后在 square 上工作。想象一下,square 确实是许多尚未定义的复杂函数之一,return 是一个具有非平凡构造函数的复杂数据结构。我将不得不编写大量代码来创建 returnable 对象,只是为了编译函数。

C++ 中是否有类似 undefined 的快捷方式?

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

int square(int x) {
  throw("undefined");
}

您还可以使用如下断言:

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

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

C++ 具有纯 virtual 函数,用于抽象基础 classes。

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

无法调用函数foo::bar(),甚至无法创建foo对象,但可以在foo的派生class中覆盖它。但是,您可以为它定义派生的 classes 默认继承。

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

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