首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将C++中未定义的已声明函数与Haskell中的“未定义”放在一起?

如何将C++中未定义的已声明函数与Haskell中的“未定义”放在一起?
EN

Stack Overflow用户
提问于 2017-11-21 12:03:52
回答 3查看 890关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
复制
square :: Int -> Int   -- declaration
square = undefined     -- empty definition

main = putStrLn.show.square $ 3

这对于推迟关于square的工作并首先将精力放在正确的main函数上是非常有用的,因为Haskell编译器确保整个文件编译起来就像定义了square一样。

C++等效为

代码语言:javascript
代码运行次数:0
运行
复制
#import <iostream>
int square(int x){
  //TODO incomplete
  return 0;
}

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

我的目的是将像clang++这样的编译器单独作为main的打字机调用,然后在square上工作。假设square确实是许多尚未定义的复杂函数之一,这些函数返回具有非平凡构造函数的复杂数据结构。我需要编写大量的代码来创建可返回的对象,这样才能编译函数。

在C++中有类似于undefined的快速和肮脏的东西吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-21 23:02:17

谢谢你@molbdnilo。使用throw很简洁,而且工作非常完美:

代码语言:javascript
代码运行次数:0
运行
复制
int square(int x) {
  throw("undefined");
}
票数 0
EN

Stack Overflow用户

发布于 2017-11-22 15:17:38

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

代码语言:javascript
代码运行次数:0
运行
复制
int square(int x) 
{
  assert(0);
}

它的优点是它不能被抓住,而且总是失败。这将更好地保护您,以防您忘记实现该功能。

票数 0
EN

Stack Overflow用户

发布于 2017-11-22 15:49:30

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

代码语言:javascript
代码运行次数:0
运行
复制
class foo {
  virtual void bar() = 0;
};

函数foo::bar()无法调用,甚至不能创建foo对象,但是可以在foo的派生类中重写它。但是,您可以给出派生类默认继承的定义。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47412703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档