如何解释下面的代码

how to explain the following code?

本文关键字:代码 解释 何解释      更新时间:2023-10-16

我有两个关于c++编程的问题。

1) int a[10] = new int*;这个说法是有效的吗?

2) extern void test(int a,int b) throw(const char *, RangeErr);

test()做什么,throw(const char*, RangeErr)意味着抛出两个异常?RangeErr是什么?为什么是外部?这个函数是做什么的?

1)无效。数组不是指针(尽管在某些上下文中可以隐式地转换为指针)。相反,尝试:

int* a = new int[10];

2)这是一个带有(现已弃用的&不明智的)抛出规范。extern是无关的和不必要的,但表示"外部链接",这意味着该函数可以从其他编译单元调用。外部链接是未在匿名命名空间中定义或以其他方式声明为"static"的函数的默认值。

throw规范指出该函数可以抛出两种不同类型的异常(c风格的字符串和可能在提供该函数的库中定义的RangeErr异常对象)。如果函数试图抛出任何其他类型的异常,则调用std::unexpected(),这将在默认情况下终止程序。也就是说,在我所知道的编译器中,没有一个编译器比简单地忽略非空抛出规范做得更多,我相信c++ 11设计了一种不同的机制。

  1. 。自动分配数组。可以用指针代替数组,但不能用数组代替指针。

  2. 不可能告诉这个函数做什么,因为你只发布了声明,而不是定义。throw显示了它可以抛出的异常类型,在本例中是c类型字符串或RangeErr,尽管一次只有一个。RangeErr大概已经定义了。extern表示函数在其他文件中定义

经过多年的实践经验,函数的throw语法被证明是一个错误。根据具体情况和编译器,throw ()可能会有些用处,但异常规范通常令人困惑,有时会妨碍编译器优化。请看Herb Sutter的这篇文章,他对c++略知一二。

1)不。不能给裸数组赋值。

2) test()是函数名。throw(...)列出了它可以抛出的异常类型。RangeErr是某种类型。extern表示该函数是外部定义的,并且可以在编译单元之外访问(即从其他文件)。

1)so No

2)这意味着该函数只能抛出类型为"const char *"answers"RangeErr"的异常。至于RangeErr是什么,我认为它会在代码的其他地方定义,很可能是从异常派生的。外部主要是函数的代码是外部链接的(dll,所以,或者其他什么),你必须检查该库的api文档,以找出它的作用