我有两个关于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?这个功能有什么作用?
答案 0 :(得分:5)
1)无效。数组不是指针(尽管在某些上下文中它可以隐式转换为一个)。相反,尝试:
int* a = new int[10];
2)这是一个带有(现已弃用且不明智的)抛出规范的函数声明。 extern是无关的和不必要的,但是表示“外部链接”,这意味着可以从其他编译单元调用该函数。外部链接是未在匿名命名空间中定义或以其他方式声明为“静态”的函数的默认值。
throw规范指示此函数可以抛出两种不同类型的异常(C样式字符串和可能在提供此函数的库中定义的RangeErr异常对象)。如果函数尝试抛出任何其他类型的异常,则调用std :: unexpected(),默认情况下会终止该程序。也就是说,我所知道的编译器不仅仅是忽略了非空的抛出规范,而且我相信为C ++ 11设计了一种不同的机制。
答案 1 :(得分:2)
没有。数组自动分配。您可以使用指针而不是数组,但不能使用数组而不是指针。
由于您只发布了声明而不是定义,因此无法确定此函数的作用。 throw
显示它可以抛出的异常类型,在这种情况下,它将是C类型字符串或RangeErr
,尽管一次只有一个。 RangeErr
可能已经定义了。 extern
表示该函数在其他文件中定义。
经过多年的实践经验,函数的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文件,以找出它的作用。^^ 希望有所帮助。