2016-03-26 47 views
2

我有以下代碼。如何爲在C++中使用'char *'的函數提供'const char *'參數?

const char* my_input = "my string"; 

void my_function(char* my_argument); 

int main() 
{ 
    my_function(my_input); 
} 

void my_function(char* my_argument) 
{ 
    /* Do something */ 
} 

請注意,my_function的參數需要'char *',但我提供了一個'const char *'。

我的IDE給了我錯誤:沒有匹配函數調用'my_function'。

我認爲這是因爲函數調用被解釋爲'my_function(const char * my_argument)',我明顯沒有定義(也不想)。

我該如何做到這一點,以便我的常量輸入對於預期的非常量參數有效?

在我的真實程序中,我有一個函數,它接受'char *',但它不會修改它。論證本身可能不是一個常數(通常不是),然而有時我期望一個常數。

+0

看起來我們在這裏有一個匿名的答案 - downvoting機器人 –

+0

函數是否試圖修改數據?這是你必須回答的第一個問題。 – AnT

+0

@AnT - 不,我無意修改這個論點。 –

回答

4

它不被解釋爲my_function(const char *)調用。它被解釋爲my_function(char *)呼叫,因爲在任何地方都沒有其他版本的my_function。但是,這是不允許的,因爲它違反了C++語言的常量正確性規則。這些規則禁止將const char *指針隱式轉換爲char *類型。

你要在這裏回答的第一個問題是,爲什麼你想一個指針傳遞給不斷數據潛在把它當作非恆定(修改)數據的功能。這明顯違反了const正確性。

如果你的my_function沒有真正修改數據,那麼接下來的問題是爲什麼它用char *參數而不是const char *參數聲明。

只有作爲最後手段,如果您確定my_function並未真正修改數據,但出於某種原因無法更改其聲明(例如第三方代碼),則可以通過強制轉換爲char *

my_function(const_cast<char *>(my_input)); 
+0

因此,在我的真實程序中,我有一個'const char * empty_string =「」;'。有時我想用它作爲論據。這是否違反const正確性?如果是這樣,我該如何解決它的意圖? –

+0

@Sir Jony:你的'empty_string'是一個指向字符串的指針。字符串文字是不可變的。如果你將它作爲'char *'傳遞給一個修改函數,這不僅會違反const正確性,你的程序實際上會崩潰並燒燬。你沒有提供有關情況的重要細節,這就是爲什麼不可能給你一個具體的答案。 – AnT

+0

我編輯了我的問題。看它的底部。 –

4

這裏,最穩定的解決辦法是讓你輸入一個char*,而不是const char*

char my_input[] = "my string"; 

但是,如果你不能,另一種解決方案是使用const_cast來「安撫」你的IDE上參數:

int main() 
{ 
    my_function(const_cast<char*>(my_input)); 
} 

但要注意用這種招數:如果你的變量是隻讀的,你的函數my_function嘗試修改它,準備好分段錯誤。

如果您確定您的C函數不會嘗試執行任何操作而只是讀取指針的數據,即使參數不是const,您也可以這樣做,因爲它有時會在C庫中發生。
否則,你必須找到一種方法來傳遞一個可修改的參數。

如果你的數據是const,更重,但很安全的方法是將原來的指針複製到一個新的,修改的一個:

int main() 
{ 
    char* copy = strdup(my_input); // Or a static buffer if you know precisely your input size 
    my_function(copy); 
    free(copy); 
} 
+0

有沒有「黑客」的解決方案,並可能引入更多的問題? –

+1

@SirJony它不是「黑客」。 C++編譯器可以防止你做一些基本的愚​​蠢的事情,並且覆蓋它你必須是冗長的。 –

+0

@AntonSavin,好的。只要它不是運行時問題,我很好。我只是擔心編譯器不會警告我。但如果是這樣的話,我想這很好。 –

0

您可以使用const_cast

my_function(const_cast<char*>(my_input)); 

但是,這是危險的,因爲如果my_function修改my_argument,這是未定義的行爲。

0

如你所知,一個const變量不能被修改,所以你不能把它傳遞給可以改變其值的函數。

如果您需要傳遞該變量的值,那麼最好的方法是創建一個可寫的非const拷貝。

char my_copy[strlen(my_input) + 1]; 
strcpy(my_copy, my_input); 
my_function(my_copy); 
相關問題