2011-03-23 37 views
3

我已经声明为一个函数:C/C++铸造成const古怪

int myFunction(const float** ppArr, const int n, const int m); 

,当我把它称为像这样:

float** ppArr = new float*[5]; 
// Some initialization of ppArr 

int result = myFunction(ppArr, 5, 128); <<<< Error 

和错误的是(VS 2008 Express的):

error C2664: 'Test_myFunction.cpp' : cannot convert parameter 1 from 'float **' to 'const float **' 

WTF?我正在将float **转换为const float **。那可能出什么问题? :/

编辑:感谢您令人难以置信的快速反应! :)

回答

0

float**无法转换为const float**

它可以转换成float* const*const float* const*。就像这样:

void f(float* const* p) {} 

void h(const float* const* p) {} 

int main() { 
    float** p= new float*[5]; 
    f(p); 
    h(p); 
} 

与GCC编译:http://ideone.com/RrIXl

+1

无法解释原因 – 2011-03-23 18:21:08

+0

@大卫:其他答案解释说。我只是懒惰:P – Nawaz 2011-03-23 18:25:28

0

谢谢大家的答案。我现在已经通读了Faq并完成了一些编译器测试,现在我完全理解它是如何工作的。最后;)

+3

StackOverflow的格式与常规论坛不同。你不应该试图添加一个答案来保持对话。为此目的使用评论。 – 2011-03-23 18:20:43

+0

@大卫:对不起,这实际上是为了防止它继续下去,因为我已经在这里掌握了答案:) – Robert 2011-03-24 18:56:48

+0

没问题:)你总是可以接受一个答案,而这非常暗示你满意。 – 2011-03-25 08:45:07

1

只是添加一个重要的观察到大多数有效的答案:事情是不同的C和C + +。然而,这个技巧在C++中的工作原理与Foo const* const*这不适用于C,它不会接受这一点,并发出警告。

在C语言中,如果想将类型安全转换为Foo const* const*,则必须采用更复杂的方法。

+0

我无法找到为什么C(甚至是C11)与C++相反,不允许将'Foo **'隐式转换为'Foo const * const *'的原因。你碰巧知道吗? – 2013-12-19 14:01:52

+0

我有模糊的记忆,委员会认为,强制执行这样的规则对于直接编译器实现来说太复杂了。 (那么这些野兽是否曾经存在过?)无论如何,这在C中是一个真正的限制,并且使得对于多维函数参数使用'const'几乎是不切实际的。 – 2013-12-19 15:04:53

+0

这让我想哭。这是一个真实的,客观的缺陷。我从来没有写过一个编译器,但是我没有看到允许添加任何长度的隐式添加'const'的链,而不是只有长度<= 1。 – 2013-12-19 16:57:12