development

문자열 리터럴에서 'char *'로의 더 이상 사용되지 않는 변환

big-blog 2021. 1. 7. 20:36
반응형

문자열 리터럴에서 'char *'로의 더 이상 사용되지 않는 변환


다음과 같은 문자열 배열을 선언하는 프로그램이 있습니다.

char *colors[4] = {"red", "orange", "yellow", "blue"};

하지만 위의 컴파일러 경고가 표시됩니다. 컴파일되지만 더 이상 사용되지 않는 방법을 사용하고 싶습니다 (있는 경우). 그게 무슨 뜻인지 알아 내려고 노력했지만 알아낼 수없는 것 같습니다. 나는 'char'가 작동하기 전에 'const'를 사용한다고 들었지만 누군가가 오류의 의미를 설명 할 수 있다면 도움이 될 것입니다. 감사.


입력하는 문자열 : "red", "organge"등은 프로그램 코드 자체 내에 정의되어 있기 때문에 "리터럴"입니다 (디스크, 사용자 입력 / stdin 등에서 직접 읽지 않음).

즉, 어느 시점에서든 쓰기를 시도하면 colors원래 입력에 직접 액세스하여 편집하게됩니다. 이로 인해 원하지 않는 런타임 오류가 발생할 수 있습니다.

그것을 const로 선언하면이 포인터에 쓰기를 시도하지 않으며 그러한 런타임 오류를 피할 수 있습니다.

const char *colors[4] = {"red", "orange", "yellow", "blue"};

런타임에 이러한 값을 편집하고 싶다면 먼저 문자열을 복사해야합니다.


"red", "orange", "yellow", "blue"

이들은 상수 문자열입니다. 상수 문자열에 대한 비 상수 포인터를 만드는 것은 잘못되었으므로 경고가 발생합니다. 현재 경고를 받고 있지만 C ++ 03에서는 더 이상 사용되지 않고 C ++ 11에서는 금지되었으므로 오류 여야합니다.


이 대답은 모두 정확합니다.

인수로 문자 배열이 필요한 함수가 있고이 인수를 다음과 같이 전달하는 경우에 유의하십시오.

foo ("bar");

동일한 경고가 표시됩니다. 이 경우 다음 중 하나를 수행 할 수 있습니다.

1) 첫 번째 답변에 설명 된대로 다음과 같이 변경하십시오.

void foo (char[] str) { printf(str); }

const char param[] = "bar";
foo (param);

2) 다음과 같이 C ++ 표준 문자열 사용을 고려하십시오.

void foo (std::string theParam) { std::cout << theParam; }

foo ("bar");

IMHO, 실제 성능 문제와 관련이없고 C 라이브러리로 작업하지 않는 한 또는 다른 사용자가 사용할 C ++ 라이브러리를 빌드하는 경우에는 C ++ 불변 문자열 및 해당 기능 세트로 작업해야합니다.

유니 코드가 요구 사항 인 경우 여기에 설명 된대로 C ++에서의 지원은 "끔찍합니다" . 이 질문 은 몇 가지 단서를 제공합니다 (주로 IBM ICU 라이브러리 사용). 프로젝트에 이미 Qt QString가있는 경우 트릭도 수행하고 Gettext도 수행합니다.

참조 URL : https://stackoverflow.com/questions/9650058/deprecated-conversion-from-string-literal-to-char

반응형