2011-05-05 74 views
3

我有两个关于C++编程的问题。如何解释下面的代码?

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

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

是什么测试()做的,扔(为const char *,RangeErr)指抛出两个异常? RangeErr是什么?为什么是外部?这个功能是做什么的?

回答

1

1)不可以。您无法将值分配给裸露阵列。

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

1

1),所以没有

2)这意味着,该功能可以和将只抛出的异常键入“const char *”和“RangeErr”。至于什么RangeErr是我会的东西它将被定义在代码中的其他地方,最有可能来自异常。外部电源的功能的代码是外部链接(DLL,所以,或其他),你将不得不检查该文件的lib,以了解它的作用。^^ 希望有所帮助。

5

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

int* a = new int[10]; 

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

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

2
  1. 不是。数组是自动分配的。您可以使用指针而不是数组,而不是数组而不是指针。

  2. 由于您只发布了声明,而不是定义,所以无法确定此函数的功能。 throw显示了它可以抛出什么样的异常,在这种情况下它将是一个C型字符串或一个RangeErr,虽然每次只有一个。据推测已经定义了RangeErrextern表示该功能是在其他文件中定义的。

throw语法功能竟然是个错误,经过多年的实践经验。根据情况和编译器的不同,throw()可能会有所帮助,但通常情况下的异常规格会令人困惑,有时会阻止编译器优化。从Herb Sutter看到这个Guru of the Week的帖子,他对C++有了一些了解。