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* 和字符串时?

更新 1:工作中可能存在另一个问题:C 预处理器显示了这种扩展:

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

4 回答 4

4

您的函数签名旨在接受char*. 但是,值"string1" + ...是 a 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)));

如果你使用字符串。

于 2013-07-23T17:20:00.763 回答
2

编辑:我不能简单地__FUNCTION__通过将它们放在一起来连接“somestring”。我正在使用mingw编译器。

因此,为了安全起见,将所有三个部分连接在一起,如下所示:

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

更改void IPC::bomb (char * msg)void IPC::bomb (const char * msg)以消除第二个错误,以便它可以接受要防止任何修改的常量字符串。

于 2013-07-23T17:18:02.193 回答
1

您不能将 c-strings ( char*strings) 与+运算符连接起来(除非您要编写一个重载运算符来这样做)。您必须创建一个足够长的新字符串以包含要组合的两个字符串,然后使用 或类似的东西手动复制memcpy它们strncpy

于 2013-07-23T17:19:19.777 回答
1

如果你改变IPC::bombIPC::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 回答