如何在c 中留下一个声明的函数,例如haskell中的``undefined''

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

本文关键字:例如 haskell undefined 中的 函数 声明 下一个      更新时间:2023-10-16

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++这样的编译器作为main的TypeChecker,然后稍后在square上工作。想象一下,square确实是许多尚未定义的复杂函数之一,它们返回具有非平凡构造函数的复杂数据结构。我将不得不编写大量代码来创建可返回的对象,以使函数编译。

在C 中有一些类似于undefined的东西吗?

谢谢@molbdnilo。使用throw是简洁的,可以很好地工作:

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

您也可以使用以下声明:

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

这具有无法捕获的优势,并且将永远失败。如果您忘记实施该功能,这将更好地保护您。

c 具有纯virtual功能,用于抽象基类。

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

无法调用函数foo::bar(),实际上foo甚至无法创建一个对象,但是可以在派生的foo类中覆盖它。但是,您可以为其提供一个定义,该定义默认情况下是继承的。

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

undefined在实际使用中的含义是:如果您尝试实际调用它,则将崩溃程序崩溃,但会正确编译并且将通过类型检查。对于单个对象文件,为在任何地方定义的函数声明extern原型都可以完成工作。如果您要链接整个程序,则必须有某种定义(尽管功能指针可以以安全为代价),但可以是存根。

相关文章: