在Haskell中,有一个名为undefined
的常量,您可以使用它来声明一个函数,而不需要定义它(即一个带空体的函数原型),就像在
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
确实是许多尚未定义的复杂函数之一,这些函数返回具有非平凡构造函数的复杂数据结构。我需要编写大量的代码来创建可返回的对象,这样才能编译函数。
在C++中有类似于undefined
的快速和肮脏的东西吗?
发布于 2017-11-21 15:02:17
谢谢你@molbdnilo。使用throw
很简洁,而且工作非常完美:
int square(int x) {
throw("undefined");
}
发布于 2017-11-22 07:17:38
您还可以使用assert,如下所示:
int square(int x)
{
assert(0);
}
它的优点是它不能被抓住,而且总是失败。这将更好地保护您,以防您忘记实现该功能。
发布于 2017-11-22 07:49:30
C++具有纯virtual
函数,用于抽象基类。
class foo {
virtual void bar() = 0;
};
函数foo::bar()
无法调用,甚至不能创建foo
对象,但是可以在foo
的派生类中重写它。但是,您可以给出派生类默认继承的定义。
C++中另一个与undefined
有点相似的地方是一个未初始化的函数指针。更安全、更现代的解决方案可能是中止程序的lambda表达式或static
存根函数。
在实际使用中,undefined
的含义是这样的:一个占位符,如果您试图真正调用它,它将使程序崩溃,但是它编译正确,并将被类型检查。对于单个对象文件,为一个没有在任何地方定义的函数声明一个extern
原型将完成这项工作。如果要链接整个程序,就必须有某种定义(虽然函数指针可以绕过它,而代价是安全),但它可以是存根。
https://stackoverflow.com/questions/47412703
复制相似问题