2013-05-01 128 views
1

我有一个阻塞问题,试图弄清楚下面两行代表什么意思。以下是gSOAP的声明的方法声明,我很困惑,我应该如何定义参数的finstionC++中的* const * a是什么意思

SOAP_FMAC3 void SOAP_FMAC4 **soap_serialize_PointerTomss__MobileUserType**(struct soap *soap, mss__MobileUserType *const*a) 

所以我尝试以下,但无法弄清楚什么是错误在这里。

mss__MobileUserType const *mobile_user_type = setupMobileUsertype(); 
**soap_serialize_PointerTomss__MobileUserType**(soap , &mobile_user_type); 

我在做什么错在这里。

+5

不要在你的源代码中增加额外的星号来强调,而是在你的问题中使用注释或解释。就目前而言,我无法分辨这个'const'旁边是否最初有星号。 – 2013-05-01 16:29:51

+0

一个指向const的指针的指针? const_cast <>来拯救! :) – 2013-05-01 16:30:05

+5

@MichaelDorgan:'const_cast <>'从来没有拯救过任何东西。 – 2013-05-01 16:30:57

回答

5
Type *const* a; 

apointerconst pointerType

C++ const限定符适用于剩下的东西,如果左边有东西,否则它适用于什么是右边的

为了更简单考虑这一点。

int a; 
int* const p = &a; // (1) 
int** pp = &p;  // (2) This is not possible since `p` is `const` pointer. 
int* const *ppc = &p; // (3) This is your case. 

mss__MobileUserType* const mobile_user_type = setupMobileUsertype(); // (1) 
mss__MobileUserType* const *mobile_user_type_p = &mobile_user_type; // (3) 

soap_serialize_PointerTomss__MobileUserType(soap , mobile_user_type_p); 

阅读HEREHERE更多关于const正确性。

+0

备注:记住在C++中''const'限定符适用于剩下的东西,如果左边有东西,否则它适用于右边的东西。 – 2013-05-01 16:31:39

+0

@Haroogan无耻复制粘贴。 :) – stardust 2013-05-01 16:36:46

+0

我喜欢从右到左读取指针的方法,所以:a是指向一个mss__MobilUserType的const指针的指针。 – icabod 2013-05-01 16:39:53

0

假设你的声明是这样的:

SOAP_FMAC3 void SOAP_FMAC4 soap_serialize_PointerTomss__MobileUserType(struct soap *soap, mss__MobileUserType *const *a); 

然后,你需要传递一个const指针的地址:

mss__MobileUserType *const mobile_user_type = setupMobileUsertype(); 
soap_serialize_PointerTomss__MobileUserType(soap , &mobile_user_type); 
+0

这可能是不可能的。如果'setupMobileUserType()'返回一个'mss__MobileUserType const *',他需要在那里有一个'const_cast'。 – 2013-05-01 16:34:14

+0

@James:'const_cast'会出错。如果'setupMobileUserType'返回一个指向'const'对象的指针,那么他需要创建一个非'const'克隆。如果你不是添加'const'限定符的人,不要使用'const_cast'来移除它。永远。 – 2013-05-01 16:38:01

+0

'const_cast'会使它编译。之后......你可能是对的。如果在任何地方都没有const,那么可以假设典型的C,并且尽管如此,函数并不修改对象。但是由于已经存在一些常量,它们很可能是重要的,并且抛弃它们会在程序执行时引发语义问题。 – 2013-05-01 17:04:28

1

您调用的函数需要一个指向常量指针 到(非const)mss__MobileUserType。表达式 &mobile_user_type是指向(非const)指向const mss__MobileUserType的指针。两者之间没有隐含的转换 。 (把const指针指向非const的指针 也很奇怪,但是我不知道这个库,所以也许有 的一个原因,而且它也是未定义的行为,因为有两个连续的下划线,它们的符号连接为 。)

0

一个声明可以与可能CV-型的Qualfied说明符开始,例如:

X 
const X 
X const 

它然后可以后跟零更PTR声明符,如:

* 
* const 

每一个指定一个指向前一个类型的指针。在PTR说明符的常量适用于指针,而不是类型:

例如:

const X* 
X const* 
X* const 
X const * const 
X const **const*** 

让我们打破:

const X ** const* 

这就是:

const X - const X 
*  - pointer to previous 
* const - const pointer to previous 
*  - pointer to previous 

所以它是一个“指向常量X的指针的const指针指针”

+1

Five- *编程?神圣* * – 2013-05-01 16:39:17