如何解释以下代码?

时间:2011-05-05 20:27:47

标签: c++

我有两个关于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?为什么extern?这个功能有什么作用?

4 个答案:

答案 0 :(得分:5)

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

int* a = new int[10];

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

throw规范指示此函数可以抛出两种不同类型的异常(C样式字符串和可能在提供此函数的库中定义的RangeErr异常对象)。如果函数尝试抛出任何其他类型的异常,则调用std :: unexpected(),默认情况下会终止该程序。也就是说,我所知道的编译器不仅仅是忽略了非空的抛出规范,而且我相信为C ++ 11设计了一种不同的机制。

答案 1 :(得分:2)

  1. 没有。数组自动分配。您可以使用指针而不是数组,但不能使用数组而不是指针。

  2. 由于您只发布了声明而不是定义,因此无法确定此函数的作用。 throw显示它可以抛出的异常类型,在这种情况下,它将是C类型字符串或RangeErr,尽管一次只有一个。 RangeErr可能已经定义了。 extern表示该函数在其他文件中定义。

  3. 经过多年的实践经验,函数的throw语法证明是错误的。 throw ()可能会有所帮助,具体取决于情况和编译器,但异常规范通常会令人困惑,有时会阻止编译器优化。请参阅Herb Sutter的这篇Guru of the Week帖子,他对C ++了解了一两件事。

答案 2 :(得分:1)

1)否。您无法为裸阵列分配值。

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

答案 3 :(得分:1)

1)所以没有

2)这意味着该函数只能抛出“const char *”和“RangeErr”类型的异常。至于RangeErr是什么东西,它将被定义在代码中的其他地方,很可能是从异常派生的。外部电源,该函数的代码是外部链接(DLL,所以,或其他),你将不得不检查该lib的api文件,以找出它的作用。^^ 希望有所帮助。