2013-05-01 121 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