2013-07-23 73 views
1

我寫了一個小函數來接受一個「字符串」並記錄下來。C++ string/char * concatenation

void 
IPC::bomb (char * msg) { /* etc */ } 

調用此實例並不編譯:

bomb(__FUNCTION__": socket() call failed: " + strerror(errno)); 

診斷:

./c/IPC.cpp:26: error: expected ')' before string constant 
./c/IPC.cpp:26: error: invalid conversion from 'const char*' to 'char*' 

我有關如何使用引用的文字,標準有效地開展工作很迷茫::字符串,char *以及常量如何計算。我如何解決上述問題?一般來說,是否存在關於字符串連接的一些經驗法則,尤其是,混合char *和字符串?

更新1:有可能在工作的另一個問題:C預處理表明這種擴張:

bomb(std::string(__FUNCTION__ ": socket() call failed: ") + strerror((*__errno_location()))); 

回答

1

如果更改IPC::bomb使其IPC::bomb(const std::string& msg),那麼你可以做:

bomb(std::string(__FUNCTION__) + ": socket() call failed: " + strerror(errno)); 

,並沒有任何錯誤。

這裏有一個完整的程序做類似服用點:

#include <string> 
#include <iostream> 
#include <cstring> 


void func(std::string str) 
{ 
    std::cout << str << std::endl; 
} 

int main() { 
    func(std::string(__FUNCTION__) + ":Some string " + strerror(2)); 
    return 0; 
} 
+0

我試過了(在'__FUNCTION__'和'「之間插入一個空格之後:」etc ..「',但現在變成了'./c/IPC.cpp:26:錯誤:預期的主表達式'('token 。 /c/IPC.cpp:26:error:expected')'before string constant'。c預處理器顯示了這個擴展:'bomb(std :: string(__ FUNCTION__「:socket()call failed:」)+ strerror(( * __ errno_location())));' – Chap

+0

嗯,讓我試試吧...... –

+0

好的,我已經編輯並添加了一個完整的小程序來試用它 –

2

編輯:我不能簡單地拼接__FUNCTION__「somestring」通過將其放在一起。我正在使用mingw編譯器。

所以是安全連接所有三個部分一起這樣的:

bomb(string(__FUNCTION__) + ": socket() call failed: " + string(strerror(errno))); 

變化void IPC::bomb (char * msg)void IPC::bomb (const char * msg)擺脫第二個錯誤,因此它可以接受常量字符串將被保護,任何修改。

+0

沒錯。 __FUNCTION__實際上是一個*變量*! http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html – Chap

+0

'__FUNCTION__'我的意思是。 – Chap

1

不能連接C字符串(char*字符串)和+運算符(除非您要編寫重載運算符來完成此操作)。您必須創建一個足夠長的新字符串以包含要合併的兩個字符串,然後用memcpy,strncpy或類似的東西手動複製它們。

4

您的功能簽名旨在接受char*。但是,值"string1" + ...const char*,因爲它是一個臨時對象。將您的功能簽名更改爲IPC::bomb(const char* msg),並且應該沒問題。

順便說一句,你不能只使用operator +連接兩個C風格的字符串,因爲它只是執行指針運算。嘗試使用std::string,而不是將每個字符串都轉換爲此類型。

所以,這個例子可能看起來像

void IPC::bomb (const std::string& msg) { /* etc */ } 

bomb(std::string(__FUNCTION__": socket() call failed: ") + 
    std::string(strerror(errno))); 

,如果你使用的字符串。