2015-10-19 106 views
3

我已經得到了包括從C++應用程序使用了一些C代碼複製const的錯誤,這裏最重要的部分:用C++封裝C代碼

C代碼

ifdef __cplusplus 
extern "C" { 
endif 

... 
typedef void* problem_type; 

... 
int problematic_fn_proto(const problem_type const arg); 

ifdef __cplusplus 
} 
endif 

不幸的是,由於duplicate 'const'錯誤,這不會編譯。這是導致問題的typedef。如果我只是將功能原型更改爲:

int problematic_fn_proto(const void* const arg); 

沒有更多問題。很遺憾,我無法刪除typedef。這裏有解決方案嗎?我可以對C部分進行其他更改,但typedef和它用作函數的參數必須保留。

+0

注意兩個'常量problem_type'和'problem_type const'是'無效* const'的別名,而不是'常量無效* const'。 – cpplearner

+0

@creamarner請解釋。說const const void意味着地址和地址指向的值是不可變的,是正確的嗎? – DaveyLaser

+0

查看任何C++ FAQ,它應該解釋指針到常量和常量指針之間的區別。這就是說,爲什麼你不能修復代碼? –

回答

6

你得到這個的原因是,現在是它自己的權利類型,但唯一的地方,雙const(const直接之前和之後類型具有相同的含義)是有道理的,如果你使用指針。有幾個選項,如果你仍然想使用typedef

首先是不包括typedef的指針:

typedef void problem_type; 
int problem_fn_proto(const problem_type* const arg); 

第二個是包含在類型定義的const符:

typedef void const* cproblem_type; 
typedef void* problem_type; // non-const variant not used here 
int problem_fn_proto(cproblem_type const arg); 

在最後的解決方案中,cproblem_type是一個指向常數數據的指針,使用cproblem_type const表示常數(即指向常數數據的常量指針)。

第三種解決方案是注意參數的常量沒有多大意義。如果功能發生改變它不是從調用者得到的說法:

typedef void const* cproblem_type; 
int problem_fn_proto(cproblem_type arg);