我写了一个小函数来接受一个“字符串”并记录它。
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 ())));
答案 0 :(得分: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)));
如果您使用字符串。
答案 1 :(得分:2)
编辑:我不能通过将它们放在一起简单地连接__FUNCTION__
“somestring”。我正在使用mingw编译器。
为了安全起见,将这三个部分连接在一起,如下所示:
bomb( string(__FUNCTION__) + ": socket() call failed: " + string(strerror(errno)) );
将void IPC::bomb (char * msg)
更改为void IPC::bomb (const char * msg)
以消除第二个错误,以便它可以接受要保护免受任何修改的常量字符串。
答案 2 :(得分:1)
您无法将c-strings(char*
字符串)与+
运算符连接起来(除非您要编写一个重载运算符来执行此操作)。您必须创建一个足够长的新字符串,以包含要组合的两个字符串,然后使用memcpy
,strncpy
或类似内容手动复制它们。
答案 3 :(得分: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;
}