2013-07-23 3 views
1

"문자열"을 받아들이고 로그하는 작은 함수를 작성했습니다.C++ 문자열/char * 연결

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 *, 그리고 어떻게 const-ness가 그 안에 들어 있는지를 보여줍니다. 위의 문제를 어떻게 해결합니까? 그리고 일반적으로 문자열 연결에 대한 몇 가지 규칙이 있습니까? char *와 strings를 혼합 할 때?

UPDATE 1 : C 전처리이 확장을 보여줍니다 : 직장에서 또 다른 문제가있을 수 있습니다

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

답변

1

, 당신은 할 수 있습니다.

#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__'과'': .. ".."사이에 공백을 넣은 후 시도했지만 ./c/IPC.cpp:26 : error : '('토큰 . 'std :: string (__FUNCTION__ ") : socket() 호출 실패 :") + strerror ((문자열에 대한 호출이 실패했습니다 : /c/IPC.cpp:26 : error : expected') '문자열 상수 앞에' – Chap

+0

음 ... 시도해 보도록하겠습니다 ... –

+0

좋아, 편집하고 완성 된 작은 프로그램을 추가했습니다. –

2

편집 : 나는 단순히 함께 배치하여 __FUNCTION__ "somestring"를 연결할 수 없었다. 나는 mingw 컴파일러를 사용하고 있었다. void IPC::bomb (const char * msg)

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

변경 void IPC::bomb (char * msg) 그것을 어떤 변경으로부터 보호되어야한다 상수 문자열을 받아 들일 수 있도록 두 번째 오류 없애 :

그래서 같이 함께 모두 세 부분을 연결, 안전합니다.

+0

네 :

여기에 비슷한 somehting을 할 수있는 완벽한 프로그램입니다. __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))); 

처럼 보일 수 있습니다.

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

을하고 오류가없는 : 그것은 IPC::bomb(const std::string& msg) 수 있도록 당신이 IPC::bomb을 변경하는 경우