1

「文字列」を受け入れてログに記録する小さな関数を作成しました。

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*'

引用符で囲まれたリテラル、std::string、char*、および const-ness をどのように扱うかについて、私は非常に混乱しています。上記の問題を解決するにはどうすればよいですか?そして、一般的に、文字列の連結、特にいくつかの経験則はありますか? char* と文字列を混在させるときは?

UPDATE 1 : 別の問題が発生している可能性があります: C プリプロセッサは次の展開を示します:

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

4 に答える 4

4

関数のシグネチャは、 を受け入れるように設計されていますchar*。ただし、一時オブジェクトであるため、値"string1" + ...はです。const char*関数の署名を に変更するIPC::bomb(const char* msg)と、問題ないはずです。

ちなみに、operator+ を使用して 2 つの C スタイルの文字列を連結することはできません。これはポインター演算を実行するだけだからです。代わりに、使用してstd::stringいるすべての文字列をこの型にキャストしてみてください。

したがって、この例は次のようになります

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

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

文字列を使用する場合。

于 2013-07-23T17:20:00.763 に答える
1

char*演算子で c-string (文字列) を連結することはできません+(そうするためにオーバーロードされた演算子を作成する場合を除きます)。結合したい 2 つを含むのに十分な長さの新しい文字列を作成し、それらを手動でコピーする必要がありmemcpyますstrncpy

于 2013-07-23T17:19:19.777 に答える
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;
}
于 2013-07-23T17:21:57.200 に答える